这里先把从别处找来的资料放到这里,然后再总结下需要注意的地方

InnoDB中对外键约束定义的语法看起来如下:

[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)

REFERENCES tbl_name (index_col_name, ...)

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

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

外键定义服从下列情况:

·  所有tables必须是InnoDB型,它们不能是临时表。

·  在引用表中,必须有一个索引,外键列以同样的顺序被列在其中作为第一列。这样一个索引如果不存在,它必须在引用表里被自动创建。

·  在引用表中,必须有一个索引,被引用的列以同样的顺序被列在其中作为第一列。

·  不支持对外键列的索引前缀。这样的后果之一是BLOB和TEXT列不被包括在一个外键中,这是因为对这些列的索引必须总是包含一个前缀长度。

·  如果CONSTRAINT symbol被给出,它在数据库里必须是唯一的。如果它没有被给出,InnoDB自动创建这个名字。

其中tbl_name被称作为父表,定义外键的表被称作为子表。

外键约束对子表的含义:

如果在父表中找不到候选键,则不允许在子表上进行insert/update(即默认情况下(RESTRICT下),定义了外键以后就不能对子表进行删除和修改操作)

但是实际开发中,我们想要做的是更新父表的数据,同时更新子表相关数据,删除父表数据后,可能需要对子表进行set null置空操作,那么先来看看外键约束对父表的含义吧:

在父表上进行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的检查是在语句执行完成时

理论讲完以后,我来举个简单的例子:

父表的创建语句如下:

CREATE TABLE `test` (

`id` int(11) NOT NULL AUTO_INCREMENT,

`name` varchar(244) DEFAULT NULL,

PRIMARY KEY (`id`),

KEY `name` (`name`),

CONSTRAINT `test_ibfk_1` FOREIGN KEY (`name`) REFERENCES `use2` (`name`) ON D

ELETE SET NULL ON UPDATE CASCADE

) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8

子表创建语句如下:

//这个是子表,子表name字段必须是索引,参见上面的规则

CREATE TABLE `user` (

`name` varchar(244) NOT NULL,

`gender` enum('male','female') NOT NULL,

PRIMARY KEY (`name`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8

这里需要注意的两点:

①如果主表想使用on delete set null ,则外键字段必须在子表中设置的为null(刚开始的时候一直不知道哪里出错,搞了半天。。)

②父表设置on update cascade表示只要父表更新,子表相应字段也要更新,所以这就要求,父表和子表这两个字段的数据类型和长度必须保持一致,否则会出错的

③默认情况下是严格方式,说通俗点就是子表中一旦有对应的数据和父表相对应,则父表相应的数据就不能做删除和更新操作了

其实这些理解到了以后,外键的约束这个知识点基本上没什么问题了

外键mysql缺省级联_mysql的外键约束级联修改和删除整理相关推荐

  1. C语言(APL指令)对mysql数据库的操作-----连接、读取、写入、修改、删除(保姆级讲解)

    目录 前言: C语言操作mysql前的准备工作 1.C语言连接mysql数据库 函数介绍 (1)mysql_ini() 函数 (2)mysql_library_init()函数 (3)mysql_re ...

  2. mysql中非主键不能自增吗_mysql非主键自增长用法实例分析

    本文实例讲述了mysql非主键自增长用法.分享给大家供大家参考,具体如下: mysql并非只有主键才能自增长,而是设为键的列就可以设置自增长.   如下: CREATE TABLE t1 ( id I ...

  3. mysql外键写了会怎么样_mysql使用外键会影响性能吗

    推荐答案 孔雀丫丫 2015.04.10 采纳率:87%    等级:38 已帮助:18万人 外键约束对子表的含义: 如果在父表中找不到候选键,则不允许在子表上进行insert/update 外键约束 ...

  4. 关于mysql添加外键的时候报错_MySQL添加外键时报错:1215 Cannot add the foreign key constraint的一个可能解决方法...

    今天给设计好的班级表和专业表以及院系表添加外键时,报了这样一个错误 ** 1215 Cannot add the foreign key constraint ** 去百度搜了一圈,说可能时因为字段类 ...

  5. mysql外键怎么写sql文_mysql 创建外键sql语句

    createtableUserInfo(User_nIDintnotnull,--identityUser_sNovarchar(50)null,--编号User_sNamevarchar(50)nu ...

  6. mysql rowid踢重_MySQL中主键与rowid的使用陷阱总结

    前言 大家在MySQL中我们可能听到过rowid的概念,但是却很难去测试实践,不可避免会有一些疑惑,比如: 如何感受到rowid的存在: rowid和主键有什么关联关系: 在主键的使用中存在哪些隐患: ...

  7. mysql主键重复会覆盖还是_mysql如果主键重复了会发生什么情况

    首先创建一个person表: create TABLE `person`( `id` int not null auto_increment, `name` VARCHAR(255) , `age` ...

  8. mysql设置id起点_mysql自增ID起始值修改方法

    在MysqL中很多朋友都认为字段为AUTO_INCREMENT类型自增ID值是无法修改,其实这样理解是错误的,下面介绍MysqL自增ID的起始值修改与设置方法. 通常的设置自增字段的方法:创建表格时添 ...

  9. mysql创建管理密码_mysql 创建用户与授权、修改密码

    一, 创建用户: CREATE USER用于创建新的MySQL账户.要使用CREATE USER,您必须拥有mysql数据库的全局CREATE USER权限,或拥有INSERT权限.对于每个账户,CR ...

最新文章

  1. linux命令 upower -e,分享|如何在 Linux 终端下检查笔记本电池状态
  2. How to find root cause of creation navigation failure
  3. 1010 一元多项式求导(C语言)
  4. 红外传感器的基础知识
  5. 《信号与系统》解读 前言:经典教材的选择
  6. UltraISO(软碟通) v8.2.0.1669 十分不错,感觉比WinISO强大些
  7. springcloud学习-Eureka、Eureka高可用集群、Ribbon客户端负载均衡策略
  8. html文件 加壳,CDHtmlDialog加壳HTML5页面跳转错误解决(原)
  9. 【开发规范】持续更新中......
  10. php逆波兰表达式,PHP实现逆波兰式 - 计算工资时用
  11. Python数据处理基础操作
  12. 百度地图爬虫——获取某区域所有中学附近的网吧数据
  13. 发票查验|身份证实名认证增强版API开发文档
  14. PB级企业电商离线数仓项目实战
  15. 可穿戴式柔性电子应变传感器(二)
  16. halcon 二值图像处理 区域的细化 skeleton
  17. Hadoop学习之SSH免密登录配置(以三台虚拟机为例,完全分布式)
  18. 【集合论】二元关系 ( 特殊关系类型 | 空关系 | 恒等关系 | 全域关系 | 整除关系 | 大小关系 )
  19. python怎么输出复数_python基础知识及应用(二)输入输出|递归|深浅拷贝|全局变量|复数...
  20. spring的学习【1】

热门文章

  1. 0基础java语法_Java零基础教程(二)基础语法
  2. CSS的样式小计(1)
  3. 51单片机实现c语言字母滚动,基于51单片机的led点阵滚动显示上下左右c语言程序.docx...
  4. java工程师面试宝典_【Java工程师面试宝典】学习说明_互联网校招面试真题面经汇总_牛客网...
  5. 运行java黑窗口是什么意思_黑窗口运行java文件步骤
  6. Unity2020.1新功能探路:脚本开发相关更新
  7. Cinchoo ETL-对大型CSV文件进行排序
  8. Vue学习笔记(四)—— 前端路由
  9. sql server 2008 数据结构及数据内容一起导出的方法(导出脚本形式)
  10. mysql master status_show master status为空解决办法