mysql概要(十四)(二)索引(补充:外键级联操作)
2024-08-20 06:33:04
[ 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/
最新文章
- java复杂枚举
- HTML元素坐标定位,这些知识点得掌握
- JavaScript取得Format后的当前时间
- BZOJ2159 : Crash 的文明世界
- mobile 更改hosts
- Mysql-学习笔记(==》增删主键建立索引 七)
- Scrum Meeting---Eleven(2015-11-6)
- JavaScript 函数调用
- Navicat数据存放位置和备份数据库路径设置
- map和lambda
- ORACLE SEQUENCE 介绍
- JavaFx自定义Tab-Order
- Beta 第五天
- 算法导轮之B树的学习
- 简单的shell命令
- MyBatis insert/delete/update 的返回值
- day 7-6 GIL,死锁,递归锁与信号量,Event,queue,
- Compiler Error: Function call with parameters that may be unsafe
- jquery常用指令
- 5种必会的Java异步调用转同步的方法你会几种
热门文章
- Java编程思想学习笔记——接口
- [MVC] 自定义ActionSelector,根据参数选择Action
- Android开发学习笔记-自定义对话框
- NHibernate 集合映射深入 (第五篇) <;set>;,<;list>;,<;map>;,<;bag>;
- Android播放器推荐:可以播放本地音乐、视频、在线播放音乐、视频、网络收音机等
- 九度 1482:玛雅人的密码(BFS)
- vue中使用特殊字体
- passport登录问题:passport.use 方法没有被调用
- Java获取项目当前请求的全部URL,Java获取Referer,Java获取完整链接地址URL
- centos 7 安装 gcc-4.9.3.tar.gz