资源描述
外键约束方式如果表 A 的主关键字是表 B 中的字段,则该字段称为表 B 的外键,表 A 称为主表,表 B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以 MySQL 为例,总结一下 3 种外键约束方式的区别和联系。这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。首先创建用户组表:创建用户组表createtablet_group(idintnotnull,namevarchar(30),primarykey(id);并插入两条记录:插入记录insertintot_groupvalues(1,Group1);insertintot_groupvalues(2,Group2);下面创建用户表,分别以不同的约束方式创建外键引用关系:1、级联(cascade)方式级联方式createtablet_user(idintnotnull,namevarchar(30),groupidint,primarykey(id),foreignkey(groupid)referencest_group(id)ondeletecascadeonupdatecascade);参照完整性测试insertintot_uservalues(1,qianxin,1);#可以插入insertintot_uservalues(2,yiyu,2);#可以插入insertintot_uservalues(3,dai,3);#错误,无法插入,用户组 3 不存在,与参照完整性约束不符约束方式测试insertintot_uservalues(1,qianxin,1);insertintot_uservalues(2,yiyu,2);insertintot_uservalues(3,dai,2);deletefromt_groupwhereid=2;#导致 t_user 中的 2、3 记录级联删除updatet_groupsetid=2whereid=1;#导致 t_user 中的 1 记录的 groupid 级联修改为 22、置空(setnull)方式置空方式createtablet_user(idintnotnull,namevarchar(30),groupidint,primarykey(id),foreignkey(groupid)referencest_group(id)ondeletesetnullonupdatesetnull);参照完整性测试insertintot_uservalues(1,qianxin,1);#可以插入insertintot_uservalues(2,yiyu,2);#可以插入insertintot_uservalues(3,dai,3);#错误,无法插入,用户组 3 不存在,与参照完整性约束不符约束方式测试insertintot_uservalues(1,qianxin,1);insertintot_uservalues(2,yiyu,2);insertintot_uservalues(3,dai,2);deletefromt_groupwhereid=2;#导致 t_user 中的 2、3 记录的 groupid被设置为 NULLupdatet_groupsetid=2whereid=1;#导致 t_user 中的 1 记录的 groupid 被设置为 NULL3、禁止(noaction/restrict)方式禁止方式createtablet_user(idintnotnull,namevarchar(30),groupidint,primarykey(id),foreignkey(groupid)referencest_group(id)ondeletenoactiononupdatenoaction);参照完整性测试insertintot_uservalues(1,qianxin,1);#可以插入insertintot_uservalues(2,yiyu,2);#可以插入insertintot_uservalues(3,dai,3);#错误,无法插入,用户组 3 不存在,与参照完整性约束不符约束方式测试insertintot_uservalues(1,qianxin,1);insertintot_uservalues(2,yiyu,2);insertintot_uservalues(3,dai,2);deletefromt_groupwhereid=2;法删除updatet_groupsetid=2whereid=1;#错误,从表中有相关引用法修改注:在 MySQL 中,restrict 方式与 noaction 方式作用相同。
展开阅读全文