[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
[ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]

如果没有指定 ON DELETE 或 ON UPDATE,则默认为 NO ACTION。

此语句表示:

主表的主键发生删除或者更新(ON DELETE 或 ON UPDATE),

对于(cascade)对应从表外键对应的行会删除或外键值更新

对于(set null)对应从表外键值变更为null

对于(no action)有些特殊,如果在从表外键有对应的值,那么主表不能进行主键的更新和删除

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

这里以用户表和用户组表为例,这是一个典型的多对一关系,多个用户对应于一个用户组。
首先创建用户组表:

create table t_group (
id int not null,
name varchar(),
primary key (id)
);

并插入两条记录:

insert into t_group values (, 'Group1');
insert into t_group values (, 'Group2');

下面创建用户表,分别以不同的约束方式创建外键引用关系:
1、级联(cascade)方式

create table t_user (
id int not null,
name varchar(),
groupid int,
primary key (id),
foreign key (groupid) references t_group(id) on delete cascade on update cascade
);

参照完整性测试

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

约束方式测试

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

2、置空(set null)方式

create table t_user (
id int not null,
name varchar(),
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 (, 'qianxin', ); #可以插入
insert into t_user values (, 'yiyu', ); #可以插入
insert into t_user values (, 'dai', ); #错误,无法插入,用户组3不存在,与参照完整性约束不符

约束方式测试

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

3、禁止(no action / restrict)方式

create table t_user (
id int not null,
name varchar(),
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 (, 'qianxin', ); #可以插入
insert into t_user values (, 'yiyu', ); #可以插入
insert into t_user values (, 'dai', ); #错误,无法插入,用户组3不存在,与参照完整性约束不符

约束方式测试

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

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

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

最新文章

  1. java复杂枚举
  2. HTML元素坐标定位,这些知识点得掌握
  3. JavaScript取得Format后的当前时间
  4. BZOJ2159 : Crash 的文明世界
  5. mobile 更改hosts
  6. Mysql-学习笔记(==》增删主键建立索引 七)
  7. Scrum Meeting---Eleven(2015-11-6)
  8. JavaScript 函数调用
  9. Navicat数据存放位置和备份数据库路径设置
  10. map和lambda
  11. ORACLE SEQUENCE 介绍
  12. JavaFx自定义Tab-Order
  13. Beta 第五天
  14. 算法导轮之B树的学习
  15. 简单的shell命令
  16. MyBatis insert/delete/update 的返回值
  17. day 7-6 GIL,死锁,递归锁与信号量,Event,queue,
  18. Compiler Error: Function call with parameters that may be unsafe
  19. jquery常用指令
  20. 5种必会的Java异步调用转同步的方法你会几种

热门文章

  1. Java编程思想学习笔记——接口
  2. [MVC] 自定义ActionSelector,根据参数选择Action
  3. Android开发学习笔记-自定义对话框
  4. NHibernate 集合映射深入 (第五篇) <set>,<list>,<map>,<bag>
  5. Android播放器推荐:可以播放本地音乐、视频、在线播放音乐、视频、网络收音机等
  6. 九度 1482:玛雅人的密码(BFS)
  7. vue中使用特殊字体
  8. passport登录问题:passport.use 方法没有被调用
  9. Java获取项目当前请求的全部URL,Java获取Referer,Java获取完整链接地址URL
  10. centos 7 安装 gcc-4.9.3.tar.gz