sqlserver查询表的外键外键对应关系是一对一,还是一对多

求助!SQLServer如何删除多表(10表以上)中的同┅个外键

最近在做一个OA系统用SQLServer2008数据库。系统里有个删除员工的功能但是考虑到其他表中有员工表的外键,删除时应该将其他表中相关嘚记录全部删除请问如何写语句?

比如员工表是OA_User员工编号Uid,数据库中最少有10张表里有Uid外键请问如何删除其他表中的相关记录?


--删除主表中udi 为2的记录没有报错
--附表中的uid为2的记录,自动删除
级联删除没怎么用过语法什么的都不太明白,我先去熟悉熟悉

1、找到附表,吔就是引用oa_user表中的uid的表然后找到外键,右键选择“修改”


2、在删除中选项“级联”


外键是保证数据表中的数据存在湔提是在另一张数据表中事先存在对应外键的数据;例如要先有人员信息才能有这个人员的工资信息那工资表就要与人员表建立外键;

總结:有些依赖表需要有外键索引。

在主从表设计中常常使用外键在这两个表之间建立关联。当从主表中删除一行数据时SQL Server便会检查从表中是否有相同外键的行存在。如果从表没有包含外键列的索引SQL SERVER需要扫描整个从表。可以想象:从表越大删除的时间越长。更新主表時的情况也是一样

检查从表是否有该键值的引用

检查从表是否有旧键值的引用

 因为主表有唯一聚集或非聚集的索引,所以在从表中插入戓修改时能利用主表的索引快速定位。

 下面来举例说明:

执行ta上的删除动作看看计划与IO:

可以看出,由于没有col4上的索引所以SQL SERVER只得在tb表上进行聚集索引扫描。IO如下:

表'tb'扫描计数1,逻辑读取7529 次物理读取3 次,预读7521 次lob 逻辑读取0 次,lob 物理读取0 次lob 预读0 次。

表'Worktable'扫描计数2,邏辑读取7 次物理读取0 次,预读0 次lob 逻辑读取0 次,lob 物理读取0 次lob 预读0 次。

表'ta'扫描计数0,逻辑读取3 次物理读取3 次,预读0 次lob 逻辑读取0 次,lob 物理读取0 次lob 预读0 次。

下面在表tb的col4上创建一个非聚集索引同样执行上面的删除动作,再看看结果:

果然SQL SERVER使用了索引查找。IO结果如下:

表'tb'扫描计数1,逻辑读取9 次物理读取4 次,预读0 次lob 逻辑读取0 次,lob 物理读取0 次lob 预读0 次。

表'Worktable'扫描计数2,逻辑读取7 次物理读取0 次,预讀0 次lob 逻辑读取0 次,lob 物理读取0 次lob 预读0 次。

表'ta'扫描计数0,逻辑读取3 次物理读取2 次,预读0 次lob 逻辑读取0 次,lob 物理读取0 次lob 预读0 次。

 对比兩个IO结果会发现在外键上建立索引大大节省了时间。

我要回帖

更多关于 sqlserver查询表的外键 的文章

 

随机推荐