[ 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概要(十四)(二)索引(补充:外键级联操作)的更多相关文章

  1. mysql概要(十四)索引(补充:外键级联操作)

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

  2. 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 ...

  3. MySQL基础(四)——索引

    MySQL基础(四)--索引

  4. MySQL创建数据表并建立主外键关系

    为mysql数据表建立主外键需要注意以下几点: 需要建立主外键关系的两个表的存储引擎必须是InnoDB. 外键列和参照列必须具有相似的数据类型,即可以隐式转换的数据类型. 外键列和参照列必须创建索引, ...

  5. 类型:Oracle;问题:oracle 查询表详细信息;结果:oracle查询表信息(索引,外键,列等)

    oracle查询表信息(索引,外键,列等) oracle中查询表的信息,包括表名,字段名,字段类型,主键,外键唯一性约束信息,索引信息查询SQL如下,希望对大家有所帮助: 1.查询出所有的用户表sel ...

  6. 003--PowerDesigner创建索引与外键

    PowerDesigner创建索引与外键 一.创建索引 双击Table->Columns->创建索引 Step1:双击Table Step2:选择Columns->创建索引 弹出如下 ...

  7. Python-多表关联 外键 级联

    分表为什么分表 多表关联多表关系 ****** 表之间的关系 为什么要分表 多对一 一个外键 多对多 一个中间表 两个外键 一对一 一个外键加一个唯一约束外键约束 ****** foreign key ...

  8. 使用admin的步骤、必知必会13条、单表的双下划线、外键的操作、多对多的操作:

    MVC M: model 模型 与数据库交互 V: view 视图 HTML C:controller 控制器 流程 和 业务逻辑 MTV M:model ORM T:template 模板 HTML ...

  9. Django学习——Django测试环境搭建、单表查询关键字、神奇的双下划线查询(范围查询)、图书管理系统表设计、外键字段操作、跨表查询理论、基于对象的跨表查询、基于双下划线的跨表查询

    Django测试环境搭建 ps: 1.pycharm连接数据库都需要提前下载对应的驱动 2.自带的sqlite3对日期格式数据不敏感 如果后续业务需要使用日期辅助筛选数据那么不推荐使用sqlite3 ...

随机推荐

  1. tftp

    Ubuntu 12.04 tftp 设置 1.sudo apt-get install tftp-hpa tftpd-hpa 2.修改/etc/default/tftpd-hpa TFTP_USERN ...

  2. Windows 下 绿化 Oracle

    既然Oracle在非windows平台上可以很“绿色”的执行,那么在windows平台上有无可能呢? 答案是“Yes-No” 基本上,除了监听器(lisentner)这个异类外,Oracle实例完全可 ...

  3. android project 文件夹

    android多国语言文件夹 http://www.blogjava.net/zhaojianhua/archive/2012/02/09/369676.html Android平板开发精确适配不同的 ...

  4. geoserver入门

    1.什么是Universal Transverse Mercator system 翻译名叫做通用横轴魔卡托系统,通常称为UTM.这个投影系从中心子午线把世界分成一系列6度的纵向宽区域. 2.什么是w ...

  5. 纯CSS制作的TAB选项卡

    代码 这里主要使用表单的单选按钮来实现这个TAB显示和隐藏,首页tab里的内容默认隐藏,如果单选按钮为选中状态(checked)就显示内容.具体请看下面代码. 关于兼容性,因为是用CSS3来制作的,所 ...

  6. 开发kendo-ui弹窗组件

    摘要: kendo-ui中只是提供了windwo插件,并没有提供页内弹窗插件.现在分享项目中自己定制的基于window组件的弹窗插件,如果你的项目也是用的kendo-ui,只需要将组件代码引到项目中即 ...

  7. Eclipse------使用Maven install出错:编码GBK的不可映射字符

    使用Maven install时报错:编码GBK的不可映射字符 原因:Maven默认使用GBK进行编码 解决方法: 在pom.xml文件中添加如下代码即可 <project> <pr ...

  8. N76E003之SPI

    串行外围总线 (SPI)N76E003系列提供支持高速串行通信的SPI模块.SPI 为微控制与外设 EEPROM, LCD 驱动, D/A 转换之间提供全双工.高速.同步传输的总线.可提供主机从机模式 ...

  9. java接口定义的静态方法和默认如何在类实现的时候使用

    在 JDK1.8,允许我们给接口添加两种非抽象的方法实现: 1.默认方法,添加 default 修饰即可: 2.静态方法,使用 static 修饰:示例如下: 这样可以实现接口的增强,那我们在类实现接 ...

  10. iOS - Share Extension

    1. 学 Share Extension 之前 先了解一下iOS的App Extension 2.1 创建Share Extension扩展Target ** 注:扩展不能单独创建,必须依赖于应用工程 ...