mysql概要(十四)(二)索引(补充:外键级联操作)
[ 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/
mysql概要(十四)(二)索引(补充:外键级联操作)的更多相关文章
- mysql概要(十四)索引(补充:外键级联操作)
[ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ][ ON UPDATE { NO ACTION | CASCADE | SE ...
- Is it bad to rely on foreign key cascading? 外键 级联操作
Is it bad to rely on foreign key cascading? I'll preface前言 this by saying that I rarely delete rows ...
- MySQL基础(四)——索引
MySQL基础(四)--索引
- MySQL创建数据表并建立主外键关系
为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是InnoDB. 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型. 外键列和参照列必须创建索引, ...
- 类型:Oracle;问题:oracle 查询表详细信息;结果:oracle查询表信息(索引,外键,列等)
oracle查询表信息(索引,外键,列等) oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表sel ...
- 003--PowerDesigner创建索引与外键
PowerDesigner创建索引与外键 一.创建索引 双击Table->Columns->创建索引 Step1:双击Table Step2:选择Columns->创建索引 弹出如下 ...
- Python-多表关联 外键 级联
分表为什么分表 多表关联多表关系 ****** 表之间的关系 为什么要分表 多对一 一个外键 多对多 一个中间表 两个外键 一对一 一个外键加一个唯一约束外键约束 ****** foreign key ...
- 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:
MVC M: model 模型 与数据库交互 V: view 视图 HTML C:controller 控制器 流程 和 业务逻辑 MTV M:model ORM T:template 模板 HTML ...
- Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询
Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...
随机推荐
- Lynx
http://www.unlinux.com/doc/soft/20051105/7402.html http://www.today-wx.com/linux/274.html 把 HTML 转成文 ...
- kafka学习之-server.properties详细说明
http://blog.csdn.net/lizhitao/article/details/25667831 -- 参考文章 http://kafka.apache.org/documentatio ...
- jquery animate动画持续运动
function fingers(){ $(".box01 .fingers").animate({"width":"7.5rem",&qu ...
- java 实现类似于python requests包的Session类,自动管理cookie。
1.在py中requests.post()和get()函数都是在那个函数内部里面自动生成了一个Session类的实例,所以requests,post和get函数要想干登陆后才能干的事情,需要添加coo ...
- 【scala】 scala 类 (五)
1.scala类 1.class 关键字 2.var 属性 默认生成getter/setter 方法 3.val 属性 默认生成getter 方法 4. 自定义getter /setter 方法 , ...
- [Module] 08 - MVP by Mosby
From: Mosby MVP使用教程[作者用心] View是消极视图(Passive View), 它尽量不去主动做事, 让Presenter通过抽象方式控制View 例子: 例如Presenter ...
- 错误 error C2678: 二进制“<”: 没有找到接受“const card”类型的左操作数的运算符(或没有可接受的转换)
错误出现的地方如下 而我又重载了<运算符,但是我没有将<运算符重载函数定义成const类型,此处是const _Ty&,不可以调用非const成员函数 而且,一般而言,像<, ...
- 【AI】图像识别-物体检测-百度AI-EasyDL-NodeJS
var https = require('https') var express = require('express'); var app = express(); var bodyParser = ...
- mysql中concat 和 group_concat()的用法
一.CONCAT()函数CONCAT()函数用于将多个字符串连接成一个字符串.使用数据表Info作为示例,其中SELECT id,name FROM info LIMIT 1;的返回结果为+----+ ...
- 【转】使程序在Linux下后台运行 (关掉终端继续让程序运行的方法)
一.为什么要使程序在后台执行 我们计算的程序都是周期很长的,通常要几个小时甚至一个星期.我们用的环境是用putty远程连接到日本Linux服务器.所以使程序在后台跑有以下三个好处: 1:我们这边是否关 ...