首页 SQLServer 图解SQL2005主外键约束怎么样级联删除

图解SQL2005主外键约束怎么样级联删除

作者:胡同里的砖头 围观群众:1456 更新于:2013-12-19

SQLServer2005

表T_Device:

DeviceID(主键)

TypeID(外键,引用到T_Type表的TypeID字段)

表T_Type:

TypeID(主键)

如图:

SQLServer2005外键约束和级联删除 - 快乐生活 - 快乐生活的博客

在表设计器里面T_Device表的TypeID字段右键单击,弹出菜单上选择关系,如图:

SQLServer2005外键约束和级联删除 - 快乐生活 - 快乐生活的博客

在弹出的外键关系对话框中的INSERT和UPDATE规范中

更新规则:层叠(默认为无操作)

删除规则:层叠(默认为无操作)

可以实现级联操作

如图:

SQLServer2005外键约束和级联删除 - 快乐生活 - 快乐生活的博客

 

这时删除表T_Type表中的一条记录,会自动删除T_Device表中对应的记录集,例如如下关系:

T_Device:

DeviceID        TypeID

1                      3

2                      1

3                      1

4                      2

5                      1

T_Type:

TypeID

1

2

3

删除T_Type表中TypeID为1的记录的时候,T_Device表中的对应的TypeID为1的记录集都会被删除。

 

此前的错误理解:

删除T_Device表中的一条记录会对应删除T_Type表中对应的记录,例如,删除T_Device表中TypeID为3的那条记录,会级联删除T_Type表中的TypeID为3的记录。

这种理解的错误在于,如果删除T_Device表中TypeID为1的一条记录(如语句delete from table T_Device where DeviceID = 2),那么如果对应的T_Type表中的TypeID为1的记录被删除了,则T_Device表中DeviceID为3和5的记录对应的TypeID就失效了,这样破坏了外键关联的正确性。

这种理解错误的根源在于没有搞清楚外键两边谁是引用,谁是实体,也没有搞清楚级联删除的意义在于删除实体的时候级联的删除其所有引用的问题。

在上述例子中对于T_Device表来讲,T_Type表中的记录为实体,T_Device表中的TypeID字段为引用。

 

另外,外键约束保证了数据的逻辑完整性,级联操作只适用于主表(或被引用表)的删除(delete)和更新(Update)操作,

不适用于从表(或引用表)的插入(Insert)操作,因此不要想象如下代码可以被执行:

insert into T_Device values(1,3);

如果认为在T_Device表中插入一条记录的同时,在T_Type表中会插入相应的被关联到T_Device表的记录是不对的,因为如果再执行insert into dev values(2,3);会如何呢?T_Type表中难道会存在两条TypeID为3的记录吗,这样违背了主键唯一性,因此做插入操作只能是先插入主表(或被引用表),然后插入从表(引用表)。

  • 本文标题: 图解SQL2005主外键约束怎么样级联删除
  • 文章分类:【SQLServer】
  • 非特殊说明,本文版权归【胡同里的砖头】个人博客 所有,转载请注明出处.
留言评论
站点声明:
1、本站【胡同里的砖头】个人博客,借鉴网上一些博客模板,取其各优点模块自行拼装开发,本博客开发纯属个人爱好。
2、所有笔记提供给广大用户交流使用,可转载,可复制,纯个人开发所遇问题锦集记录使用
Copyright © huzlblog.com All Rights Reserved. 备案号:苏ICP备2021056683号-8