[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。

这里以MySQL为例,总结一下3种外键约束方式的区别和联系。

这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:
创建用户组表
create table t_group (
id int not null,
name varchar(30),
primary key (id)
);
并插入两条记录:
插入记录
insert into t_group values (1, 'Group1');
insert into t_group values (2, 'Group2');

下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式
级联方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);

参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录级联删除
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid级联修改为2

2、置空(set null)方式
置空方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete set null on update set null
);

参照完整性测试insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #导致t_user中的2、3记录的groupid被设置为NULL
update t_group set id=2 where id=1; #导致t_user中的1记录的groupid被设置为NULL

3、禁止(no action / restrict)方式
禁止方式
create table t_user (
id int not null,
name varchar(30),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete no action on update no action
);

参照完整性测试
insert into t_user values (1, 'qianxin', 1); #可以插入
insert into t_user values (2, 'yiyu', 2); #可以插入
insert into t_user values (3, 'dai', 3); #错误,无法插入,用户组3不存在,与参照完整性约束不符

约束方式测试
insert into t_user values (1, 'qianxin', 1);
insert into t_user values (2, 'yiyu', 2);
insert into t_user values (3, 'dai', 2);
delete from t_group where id=2; #错误,从表中有相关引用,因此主表中无法删除
update t_group set id=2 where id=1; #错误,从表中有相关引用,因此主表中无法修改

注:在MySQL中,restrict方式与no action方式作用相同。

来源:http://www.samool.com/archives/41586/

最新文章

  1. MSSQLSERVER
  2. Leetcode 详解(Implement strstr)
  3. 如何启动或关闭oracle的归档(ARCHIVELOG)模式
  4. IIS目录下文件共享后System.IO.File.Exists返回false
  5. poj 2151 Check the difficulty of problems(概率dp)
  6. python 实现对象模型
  7. mongoDB初接触
  8. Microsoft Visual C++运行库合集下载(静默安装)
  9. 管理工具 Kafka Manager
  10. 编译安装gimp插件之Mathmap(流水记录)
  11. postman+jenkins+newman做接口测试的持续集成
  12. 内核对象kobject和sysfs(2)——kref分析
  13. lesson - 7 课程笔记 vim
  14. Ajax增删改查-----------删 改
  15. Android 动态的给Button、TextView、ImageView等控件设置了background后,再设置padding属性时该属性不起作用
  16. POJ 1200 Crazy Search (哈希)
  17. WINDOWS 命令行 串口 COM 发送数据
  18. Python抓取zabbix性能监控图
  19. 【转载】非Lumia 950/XL机型 强行开启continuum教程
  20. oracle EBS grant 您不具有执行当前操作的足够权限。请与您的系统管理员联系。

热门文章

  1. PHP将XML数据转换为数组
  2. POJ 2763:Housewife Wind(树链剖分)
  3. c#读取Excel的列名问题
  4. 山东理工大学第七届ACM校赛-飞花的糖果 分类: 比赛 2015-06-26 10:27 15人阅读 评论(0) 收藏
  5. JAVA基础知识之多线程——控制线程
  6. UVa 489,紫书P79,刽子手游戏
  7. Android中XML解析
  8. Spring源码之SimpleAliasRegistry解读(一)
  9. 如何通过Button获取UITableViewCell
  10. BZOJ 2584: [Wc2012]memory(扫描线+线段树)