mysql外键约束语句级连_mysql之外键约束(级联操作等) 父表子表
不理解的地方标注问号。
网上不同的博客讲的,之间似乎有些矛盾,求推荐好书。
写得不好请指出错误。
父表和子表
当两个表建立一对多关系的时候,"一"的那一端是父表,"多"的那一端是子表。
父表设置一个主键
子表设置一个外键
外键与主键相关联
B表引用A表的字段作为外键,那么A表是主表,B表是从表。
举例:
由于选课表中用到了学生表中的学生ID字段(用来与学生表进行关联,获得学生的信息),并且用到了课程表中的课程ID字段(用来与课程表进行关联,获得课程的信息),
通过上面的分析得,选课表是子表,学生表与课程表都是它的父表】
讲解1
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
外键的使用需要满足下列的条件:
两张表必须都是InnoDB表,并且它们没有临时表。
建立外键关系的对应列必须具有相似的InnoDB内部数据类型。
建立外键关系的对应列必须建立了索引。
假如显式的给出了CONSTRAINT symbol,那symbol在数据库中必须是唯一的。假如没有显式的给出,InnoDB会自动的创建。
如果子表试图创建一个在父表中不存在的外键值,InnoDB会拒绝任何INSERT或UPDATE操作。
如果父表试图UPDATE或者DELETE任何子表中存在或匹配的外键值,最终动作取决于外键约束定义中的ON UPDATE和ON DELETE选项。'InnoDB支持5种不同的动作,如果没有指定ON DELETE或者ON UPDATE,默认的动作为RESTRICT:'
CASCADE: 从父表中删除或更新对应的行,同时自动的删除或更新子表中匹配的行。ON DELETE CANSCADE和ON UPDATE CANSCADE都被InnoDB所支持。
SET NULL: 从父表中删除或更新对应的行,同时将子表中的外键列设为空。注意,这些在外键列没有被设为NOT NULL时才有效。ON DELETE SET NULL和ON UPDATE SET SET NULL都被InnoDB所支持。
NO ACTION: InnoDB拒绝删除或者更新父表。 ?有点不理解
RESTRICT: 拒绝删除或者更新父表。指定RESTRICT(或者NO ACTION)和忽略ON DELETE或者ON UPDATE选项的效果是一样的。 ?
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;
讲解
作者:匿名用户
链接:https://www.zhihu.com/questio...
来源:知乎
著作权归作者所有,转载请联系作者获得授权。
在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束。
外键的使用条件:
1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持);
2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立;
3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;
外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作;
外键的定义语法:
[CONSTRAINT symbol] FOREIGN KEY [id] (index_col_name, ...)
REFERENCES tbl_name (index_col_name, ...)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
该语法可以在 CREATE TABLE 和 ALTER TABLE 时使用,如果不指定CONSTRAINT symbol,MYSQL会自动生成一个名字。
ON DELETE、ON UPDATE表示事件触发限制,可设参数:
RESTRICT(限制外表中的外键改动) 是外表不能改外键的意思吗?
CASCADE(跟随外键改动) 外表中外键改了,原表也会改吗?
SET NULL(设空值) 这个描述是什么意思?
SET DEFAULT(设默认值)
NO ACTION(无动作,默认的)
mysql外键约束语句级连_mysql之外键约束(级联操作等) 父表子表相关推荐
- mysql 外键约束_MySQL之外键约束(FOREIGN KEY)
定义: MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键. 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每 ...
- mysql中利用sql语句修改字段名称,字段长度等操作(亲测)
在网站重构中,通常会进行数据结构的修改,所以添加,删除,增加mysql表的字段是难免的,有时为了方便,还会增加修改表或字段的注释,把同字段属性调整到一块儿.这些操作可以在phpmyadmin或者别的m ...
- 数据库名词解释 主键外键检查 非空、唯一性约束 父表 子表
Oracle数据库中,约束具体包括非空(NOT NULL)约束.唯一键(UNIQUE)约束.主键(PRIMARY KEY)约束.外键(FOREIGN KEY)约束和检查(CHECK)约束五种. 1:主 ...
- mysql当执行delete语句时备份_mysql中,执行delete语句时出现Lock wait timeout exceeded问题...
问题描述: 当我插入一条记录时,在调用save方法的时候出现了异常(记录重复了),导致了后面的commit语句不能执行了.这时我在数据库中删除重复记录时发现该表已经被锁上了.即出现 错误.但过了一会再 ...
- mysql 1075_mysql1075错误_1075报错怎么办_mysql主键冲突怎么办 - 树懒学堂
当我们使用mysql数据库的时候,非常容易遇上mysql1075的报错. 在mysql中1075报错的原因是一个字段设置了自动递增,另外一个字段被设置为主键,发生冲突. 在数据库当中,勾选自动递增的, ...
- mysql中约束由数字构成_MySQL 数据类型和约束(外键是重点)
数据类型 1. 数字(默认都是由符号,宽度表示的是显示宽度,与存储无关).tinyint 括号里指定宽度 七位2进制数最大数就是2**7 -1=127 最小是-128 验证: create tabel ...
- mysql添加约束之前不满足_MySQL:添加约束(如果不存在)
小编典典 有趣的问题.您可能需要在调用CREATE TABLE语句之前禁用外键,然后再启用它们.这将允许您直接在CREATE TABLEDDL中定义外键: 例: SET FOREIGN_KEY_CHE ...
- mysql怎么快速删除亿级数据_mysql数据库如何实现亿级数据快速清理
今天收到磁盘报警异常,50G的磁盘被撑爆了,分析解决过程如下: 1. 进入linux服务器,查看mysql文件夹中各个数据库所占的磁盘空间大小 看到了吗,光olderdb就占了25G 2. 用SQLy ...
- mysql数据库添加数据语句怎么写_mysql中多种插入数据的语句
摘抄自:https://yjclsx.blog.csdn.net/article/details/83898545 mysql中常用的三种插入数据的语句 insert into表示插入数据,数据库会检 ...
最新文章
- pyspider积累
- FPGA逻辑设计回顾(3)多比特信号上升沿检测的设计方式与陷阱?
- 聊一聊:MyBatis和Spring Data JPA的选择问题
- tab in English
- GraphPad Prism 统计教程:简单线性回归原理
- Django-请求与响应
- plsql(轻量版)_游标的使用1
- django_mailgun.MailgunAPIError: Response [401]
- php 文件加载方式
- matlab的7.3版本是什么_乐建工程宝V6.3版本升级说明公告
- mmap函数用法及示例程序
- 问题集锦13:数据库升级后,程序无法连接数据库
- java+测试ip是否通_java 批量测试主机能否ping通
- 基础学习 Linux命令
- 看雷诺公司如何使用质量工具提高功能安全相关模型软件开发效率
- 【Daily】IE弹窗SQL分割字符串
- 线程取消(pthread_cancel)
- 三角形内切圆 / 外接圆半径计算公式及证明总结 ~
- java的程序员工资一般多少_JAVA程序员工资一般是多少
- 网页视频倍速播放代码
热门文章
- 横空出世,席卷Csdn [评微软等公司数据结构+算法面试100题]
- 转,帅气的表格隔行换色+鼠标经过变色、点击变色
- COM原理与应用之COM的实现
- 存在于实数域的微观粒子7-神经网络与电磁场
- vuedraggable示例_vue拖拽列表vuedraggable
- 数学符号正三角形△和倒三角形▽的意思
- 8.6 多元高斯分布模型-机器学习笔记-斯坦福吴恩达教授
- STM32 SPI NSS 引脚为不能拉高问题
- IC-工具篇--VCS使用教程-卷二(202004013)
- 1、C++招聘笔试--C++中的C