RESTRICT为约束删除,即没有对本列的任何引用时才能删除。
如果表A的主关键字是表B中的字段,则该字段称为表B的外键,表A称为主表,表B称为从表。外键是用来实现参照完整性的,不同的外键约束方式将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松。这里以MySQL为例,总结一下3种外键约束方式的区别和联系。
这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:
并插入两条记录:
下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式
参照完整性测试
约束方式测试
2、置空(set null)方式
3、禁止(no action / restrict)方式
这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:
- 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级联修改为2
2、置空(set null)方式
- 置空方式
- 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被设置为NULL
- updatet_groupsetid=2whereid=1;--导致t_user中的1记录的groupid被设置为NULL
3、禁止(no action / 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;--错误,从表中有相关引用,因此主表中无法修改