sql数据库主键外键的正确理解-级联删除(精华)(转)

landy 2011-11-17 01:56:41
数据库为:SQLServer2005

先声明下,这个帖子帮了我大忙了,级联删除!因为初学数据库没多久,对级联和主外键关系理解的不好。
我建了几张表比如:

A:s_id,sex,from,school...,
B:....,s_id,........
C:....,s_id,........
D:....,s_id,........
E:....,s_id,........

s_id是表A的主键,而表B,C,D,E中的s_id引自表A,即s_id在B,C,D,E表中是外键

我是想实现这样的效果,当我删除表A中的s_id=10007的行时,B,C,D,E中的s_id=10007的行中所有信息也要被删除
不知道该怎么实现,后来看到这个帖子,解决办法如下,特此分享:
http://blog.sina.com.cn/s/blog_707a4cbf0100qz6c.html


表T_Device:

DeviceID(主键)

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

表T_Type:

TypeID(主键)

如图:



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



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

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

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

可以实现级联操作

如图:



这时删除表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_Type表里面只要有相应的数据就可以执行

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

保存的时候先保存T_Type表,记得一定要保存表,否则主键个外键关系实际是没有创建的
...全文
618 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
guyue032008 2012-11-12
  • 打赏
  • 举报
回复
正在学习当中
chunfang648527500 2012-11-12
  • 打赏
  • 举报
回复
级联删除虽说好用,但是在针对一个大型项目的时候并不适合,可能会引起误删数据的错误,最好还是用游标或者触发器来实现,不过这两种方法我还在学习过程,如果有谁可以帮助,希望大家多多交流
Oliver2891 2011-11-17
  • 打赏
  • 举报
回复
就把关系建好就行了,简单的很。

4,012

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧