ql数据库主键外键的正确理解-级联删除
2011-11-18 10:13
281 查看
sql数据库主键外键的正确理解-级联删除(精华)
(2011-04-10 09:42:07)
转载
标签:
| 分类: 数据库 |
表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表,记得一定要保存表,否则主键个外键关系实际是没有创建的
文章引用于:
http://blog.sina.com.cn/s/blog_707a4cbf0100qz6c.html
相关文章推荐
- ql数据库主键外键的正确理解-级联删除
- mysql如何设置主键和外键,实现级联更新、级联删除
- SQL中实现外键关键关系级联更新和删除
- mysql数据库主外键级联删除脚本RESTRICT --> CASCADE
- Oracle12C--主外键约束删除数据问题--级联操作(九)
- 外键级联删除
- MySQL入门(8)- 约束——主键约束&外键约束&级联更新/删除
- 数据库主键,外键,关系,级联保存、更新、删除
- 外键取值规则,及其级联删除
- 如何通过设计数据库实现外键的级联删除???答:
- MYSQL_使用外键约束(constraint)或触发器(trigger)来进行级联更新、删除
- Oracle12C--主外键约束删除数据问题--级联操作(九)
- SQL级联删除——删除主表同时删除从表——同时删除具有主外键关系的表
- SQL Server— 存在检测、建库、 建表、约束、外键、级联删除
- 级联删除设置外键方法
- Yii2.0 外键约束与数据级联删除
- Oracle12C--主外键约束删除数据问题--级联操作(九)
- 数据库主键,外键,关系,级联保存、更新、删除
- mysql 利用外键级联删除、更新
- sql server创建外键,子母表,级联删除。