mysql cascade|restrict|no action|set null__mysql 外键的几种约束

mysql cascade|restrict|no action|set null

MySQL有两种常用的引擎类型:MyISAM和InnoDB。目前只有InnoDB引擎类型支持外键约束。InnoDB中外键约束定义的语法如下:

[CONSTRAINT [symbol]] FOREIGN KEY[index_name] (index_col_name, ...)REFERENCES tbl_name (index_col_name,...)[ON DELETE reference_option][ON UPDATE reference_option]reference_option:RESTRICT | CASCADE | SET NULL | NO ACTION

外键的使用需要满足下列的条件:

  1. 两张表必须都是InnoDB表,并且它们没有临时表。
  2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。
  3. 建立外键关系的对应列必须建立了索引。
  4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。

如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:

  1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新子表中匹配的行。ON DELETE CASCADE和ON UPDATE CASCADE都被InnoDB所支持。
  2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
  3. NO ACTION: InnoDB拒绝删除或者更新父表。
  4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。
  5. SET DEFAULT: InnoDB目前不支持。

外键约束使用最多的两种情况无外乎:

1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

InnoDB允许你使用ALTER TABLE在一个已经存在的表上增加一个新的外键:

ALTER TABLE tbl_name
ADD [CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name,)
REFERENCES tbl_name (index_col_name,)
[ON DELETE reference_option]
[ON UPDATE reference_option]

InnoDB也支持使用ALTER TABLE来删除外键:

ALTER TABLE tbl_name DROP FOREIGN KEY fk_symbol;




MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用

今天遇到数据库的一个问题,就是每当从主表中删除一个主键id时,由于与他相关联的表中有相关的字段数据,所以无法删除。查了一大堆资料,发现我建表关联用的是on Restrict.可能问题就出在这里吧。

外键约束对子表的含义:
如果在父表中找不到候选键,则不允许在子表上进行insert/update

外键约束对父表的含义:
在父表上进行update/delete以更新或删除在子表中有一条或多条对应匹配行的候选键时,父表的行为取决于:在定义子表的外键时指定的on update/on delete子句, InnoDB支持5种方式, 分列如下

cascade方式
在父表上update/delete记录时,同步update/delete掉子表的匹配记录
On delete cascade从mysql3.23.50开始可用; on update cascade从mysql4.0.8开始可用

set null方式
在父表上update/delete记录时,将子表上匹配记录的列设为null
要注意子表的外键列不能为not null
On delete set null从mysql3.23.50开始可用; on update set null从mysql4.0.8开始可用

No action方式
如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作
这个是ANSI SQL-92标准,从mysql4.0.8开始支持

Restrict方式
同no action, 都是立即检查外键约束

Set default方式
解析器认识这个action,但Innodb不能识别,不知道是什么意思...

注意:trigger不会受外键cascade行为的影响,即不会解发trigger

在mysql中,与SQL标准相违背的三点

  1. 如果在父表中有多个key值相同,那么在进行外键check时,会当成有相同key值的其他行不存在; 比如当定义了一个restrict行为外键时,一个子表行对应到多个父表行(具有相同key值), Innodb不允许删除父表上的所有这些行

  2. 父子表是同一个表,自我参照时不允许指定on update cascade, on update set null
    从mysql4.0.13开始,允许同一个表上的on delete set null
    从mysql4.0.21开始,允许同一个表上的on delete cascade
    但级联层次不能超出15

  3. Innodb在检查unique,constraint约束时,是row by row而不是语句或事务结束;
    SQL标准中对constraint的检查是在语句执行完成时

NULL、RESTRICT、NO ACTION
删除:从表记录不存在时,主表才可以删除。删除从表,主表不变
更新:从表记录不存在时,主表才可以更新。更新从表,主表不变

CASCADE
删除:删除主表时自动删除从表。删除从表,主表不变
更新:更新主表时自动更新从表。更新从表,主表不变

SET NULL
删除:删除主表时自动更新从表值为NULL。删除从表,主表不变
更新:更新主表时自动更新从表值为NULL。更新从表,主表不变

外键约束属性: RESTRICT | CASCADE | SET NULL | NO ACTION 外键的使用需要满足下列的条件:

  1. 两张表必须都是InnoDB表,并且它们没有临时表。

  2. 建立外键关系的对应列必须具有相似的InnoDB内部数据类型。

  3. 建立外键关系的对应列必须建立了索引。

  4. 假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。

如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:

  1. CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新自表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。

  2. SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。

  3. NO ACTION: InnoDB拒绝删除或者更新父表。

  4. RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。

  5. SET DEFAULT: InnoDB目前不支持。

外键约束使用最多的两种情况无外乎:

1)父表更新时子表也更新,父表删除时如果子表有匹配的项,删除失败;

2)父表更新时子表也更新,父表删除时子表匹配的项也删除。

前一种情况,在外键定义中,我们使用ON UPDATE CASCADE ON DELETE RESTRICT;后一种情况,可以使用ON UPDATE CASCADE ON DELETE CASCADE。

当执行外键检查之时,InnoDB对它照看着的子或父记录设置共享的行级锁。InnoDB立即检查外键约束,检查不对事务提交延迟。

要使得对有外键关系的表重新载入转储文件变得更容易,mysqldump自动在转储输出中包括一个语句设置FOREIGN_KEY_CHECKS为0。这避免在转储被重新装载之时,与不得不被以特别顺序重新装载的表相关的问题。也可以手动设置这个变量:

mysql> SET FOREIGN_KEY_CHECKS = 0;mysql> SOURCE dump_file_name;mysql> SET FOREIGN_KEY_CHECKS = 1;

如果转储文件包含对外键是不正确顺序的表,这就以任何顺序导入该表。这样也加快导入操作。设置FOREIGN_KEY_CHECKS为0,对于在LOAD DATA和ALTER TABLE操作中忽略外键限制也是非常有用的。

InnoDB不允许你删除一个被FOREIGN KEY表约束引用的表,除非你做设置SET FOREIGN_KEY_CHECKS=0。当你移除一个表的时候,在它的创建语句里定义的约束也被移除。

如果你重新创建一个被移除的表,它必须有一个遵从于也引用它的外键约束的定义。它必须有正确的列名和类型,并且如前所述,它必须对被引用的键有索引。如果这些不被满足,MySQL返回错误号1005 并在错误信息字符串中指向errno 150。




restrict方式 同no action, 都是立即检查外键约束
  --限制,指的是如果字表引用父表的某个字段的值,那么不允许直接删除父表的该值;

cascade方式 在父表上update/delete记录时,同步update/delete掉子表的匹配记录 On delete cascade从mysql3.23.50开始可用;   on update cascade从mysql4.0.8开始可用
  --级联,删除父表的某条记录,子表中引用该值的记录会自动被删除;

No action方式 如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作 这个是ANSI SQL-92标准,从mysql4.0.8开始支持
  --无参照完整性关系,有了也不生效。

set null方式 在父表上update/delete记录时,将子表上匹配记录的列设为null 要注意子表的外键列不能为not null On delete set null从mysql3.23.50开始可用;   on update set null从mysql4.0.8开始可用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556086.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

编辑流程图_流程图不会绘制?一分钟手把手教你学会,超简单

我们每天的日常工作非常繁忙,经常被日常的事务性工作淹没,而忽略掉我们工作的流程是否正确,我们的方向是否正确。如果流程、方向错了,再努力都是没有用的。要确保努力与付出是有价值的,就必须确保前进方向是正确的&…

MVVM 模型

MVVM 模型 在实际代码中 <!--MVVM 模型&#xff1a;1. M: 模型(Model) : data 中的数据2. V: 视图(View) : 模板代码3. VM: 视图模型(ViewModel) : Vue 实例观察发现&#xff1a;1. data 中所有的属性&#xff0c;最后都出现在了 vm 身上2. vm 身上所有的属性 以及 Vue 原…

MySQL外键命名规范

数据库 外键命名规范 外键字段&#xff1a;与主表主键字段完全一样 主键&#xff1a;pk_表名 例如&#xff1a;pk_main 外键&#xff1a;fk_从表名_主表名 例如&#xff1a;fk_sub_main

收音机磁棒天线4根接法_有关收音机磁性天线和电路的小知识

有关收音机磁性天线和电路的小知识&#xff0c;一起来了解一下吧&#xff01;一、收音机的磁性天线有什么作用&#xff1f;用磁性天线可以代替超外差收音机的天线线圈。由于磁性天线中磁棒的导磁率大&#xff0c;因而绕在磁棒上面的线圈可以获得比较多的电磁波能量&#xff0c;…

data 的数据代理

一、Object.defineProperty() 控制对象的属性值 let num 18; let person {name: mary,age: num; };Object.defineProperty(person, age, {writable: true, // 控制属性是否可以修改. 默认值是 falseenumerable: true, // 控制属性是否可以枚举&#xff0c;默认值是 falsecon…

MySQL百万级/千万级数据存储解决方案

MySQL 百万级/千万级数据存储解决方案 百万级、千万级数据处理&#xff0c;个人认为核心关键在于数据存储方案设计&#xff0c;存储方案设计的是否合理&#xff0c;直接影响到数据CRUD操作。总体设计可以考虑一下三个方面进行设计考虑&#xff1a; 数据存储结构设计索引设计数…

vue 加载太慢_Vue首页加载过慢 解决方案

一、什么导致了首页初步加载过慢&#xff1a;app.js文件体积过大二、解决方法&#xff1a;1、Vue-router懒加载vue-router懒加载可以解决首次加载资源过多导致的速度缓慢问题&#xff1a;vue-router支持WebPack内置的异步模块加载系统。所以&#xff0c;那些使用较少的路由组件…

事件处理 v-on

<!--事件的基本使用&#xff1a;1. 使用 v-on:xxx 或 xxx 绑定事件&#xff0c;其中 xxx 是事件名2. 事件的回调需要配置在 methods 对象中&#xff0c;最终会在 vm 上3. methods 中配置的函数&#xff0c;不要用箭头函数&#xff01;否则 this 就不是 vm 了4. methods 中配…

java restful文件传输_java中使用restful web service来传输文件

【1】上传大文件&#xff1a;前端页面&#xff1a;1)同步上传&#xff1a;2)异步上传&#xff1a;异步上传文件上传文件&#xff1a;function doUpload() {// var formData new FormData($("#uploadForm")[0]);var formData new FormData()formData.append("t…

enum与int、String之间的转换

enum与int、String之间的转换 enum<->int enum -> int: int i enumType.value.ordinal(); int -> enum: enumType b enumType.values()[i]; enum<->String enum -> String: enumType.name() String -> enum: enumType.valueOf(name); 下面是Enum和字…

ios 简书 获取通讯录信息_iOS-授权获取通讯录

- (void)getContact{CNAuthorizationStatus authorizationStatus [CNContactStore authorizationStatusForEntityType:CNEntityTypeContacts];if(authorizationStatus CNAuthorizationStatusAuthorized) {// 获取指定的字段,并不是要获取所有字段&#xff0c;需要指定具体的字…

枚举ENUM的tostring() valueof()name()和values()用法

从jdk5出现了枚举类后,定义一些字典值可以使用枚举类型; 枚举常用的方法是values():对枚举中的常量值进行遍历; valueof(String name) :根据名称获取枚举类中定义的常量值;要求字符串跟枚举的常量名必须一致; 获取枚举类中的常量的名称使用枚举对象.name() 枚举类中重写了t…

Vue键盘事件

<!--1. Vue 中常用的按键别名&#xff1a;回车 > enter删除 > delete (捕获"删除"和"退格"键&#xff09;退出 > esc空格 > space换行 > tab &#xff08;特殊&#xff0c;必须配合 keydown 去使用&#xff09;上 > up下 > down左…

win10引导安卓x86_生命不息折腾不止 Win10竟与安卓有一腿

有些公司、有些产品、有些人总是生命不息折腾不止&#xff0c;不断地更新补丁、不断地出现新的漏洞。近日&#xff0c;微软又搞了几个大新闻。微软Azure营收翻倍&#xff1a;月初&#xff0c;微软重组其销售团队&#xff0c;更专注于云服务的提供&#xff0c;而其销售工作将会转…

Vue 计算属性 computed

<!--计算属性&#xff1a;1. 定义&#xff1a;要用的属性不存在&#xff0c;要通过已有的属性计算得来2. 原理&#xff1a;底层借助了 Object.defineProperty 方法提供的 getter 和 setter3. get 函数什么时候执行&#xff1f;(1). 初次读取时会执行一次(2). 当依赖的数据发…

Mysql 数据库默认值选 ‘‘“ 、Null和Empty String的区别

Mysql 数据库默认值选 ‘’" 、Null和Empty String的区别 1&#xff1a;空值(’’)是不占用空间的 2: MySQL中的NULL其实是占用空间的。官方文档说明: “NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables,…

Vue 监视属性 watch

<!--监视属性 watch:1. 当被监视的属性变化时&#xff0c;回调函数自动调用&#xff0c;进行相关操作2. 监视的属性必须存在&#xff0c;才能进行监视3. 监视的两种写法&#xff1a;(1). new Vue 时传入 watch 配置(2). 通过 vm.$watch 监视深度监视&#xff1a;(1). Vue 中…

NAVICAT MYSQL 建表字段 默认值、EMPTY STRING、空白、NULL 的区别

Navicat mysql 建表字段 默认值、empty string、空白、NULL 的区别 总结在最后&#xff0c;没啥干货 简单测试了4种类型 bigint tinyint varchar char 单引号 ‘’ 双引号 “” 自定义的默认值 如&#xff1a; 未知的姓名 新建一张用户表 CREATE TABLE user (id bigint(20…

ddr2的上电顺序_关于内存的插入顺序的问题

展开全部#ifndef FUNS_H#define FUNS_Hvoid error( char *, ... ); /* 输出错误信32313133353236313431303231363533e59b9ee7ad9431333234323734息&#xff0c;退出程序 */void flush_stdin( void ); /* 清空“输入缓冲区” */#endif#ifndef SQLIST_H#define SQLIST_H#define I…

如何将vue项目打包为.apk文件

说明&#xff1a;使用Vue.js开发完毕的app一般不作处理的话&#xff0c;就只能在浏览器上做为Webapp使用。如果需要将它安装到安卓手机上就需要打包为.apk文件了。 前提&#xff1a;安装HBuilderX 具体步骤&#xff1a; 1.在vue项目中找到config/build.js 2.找到build下的a…