MySQL外键约束(FOREIGN KEY)是什么?
向导
- 外键约束
- 外键创建规则
- 创建外键约束语法
- 外键约束创建
- 修改创建外键约束
- 删除外键
- 完整格式创建
外键约束
MySQL的外键约束用来在两个表数据之间建立链接,其中一张表的一个字段被另一张表中对应的字段约束。也就是说,设置外键约束至少要有两种表,被约束的表叫做从表(子表),另一张叫做主表(父表),属于主从关系。
其中主表中的关联字段叫做主键,外表中的关联字段叫做外键。
外键约束主要作用就是能够让表与表之间的数据建立关联,使数据更加完整,关联性更强。
关于完整性,可以通过一个例子来说明
假如有两种表,一张用户账户表(用于存储用户账户),一张是账户信息表(用于存储账户中的信息)。
1)我不小心将用户账户表中的某个用户删除了,那么账户信息表中与这个用户有关的数据就变成无源数据了,找不到其属于哪个用户账户,导致用户信息不完整。
2)我在账户信息表中随便添加了一条数据,而其在用户账户表中没有对应的用户,这样用户信息也是不完整的。
如果有了外键约束,将用户账户表设为主表,账户信息表设为从表,那么就无法直接往账户信息表中插入数据,在用户账户表中删除用户,账户信息表中的用户信息也会被删除。外键约束的方式可以使两张紧密的联系在一起,保障数据完整性和一致性的同时,日常维护也更加方便。
外键创建规则
1)必须有主表才可以设置从表。
2)主表必须实际存在。
3)必须为主表定义主键。
4)外键列的数据类型必须和主键列的数据类型相同。
5)外键列的数量必须和主键列的数量相同。
6)外键可以不是外表中的主键,但必须和主表关联字段相对应。
7)主从表创建时,存储引擎必须是InnoDB。
创建外键约束语法
create table 表名(
字段定义…
CONSTRAINT `外键名称` FOREIGN KEY (字段)REFERENCES 主表名(主键字段) 属性);
参数说明:
CONSTRAINT :用于设置外键约束名称,可以省略
FOREIGN KEY:外键设置,用于指定外键字段
REFERENCES:主表及主键设置,用于指定主表和主键
属性说明:
CASCADE:主表删除或修改记录时,从表也会对关联记录的外键字段进行修改。
RESTRICT:删除或修改主表记录,子表中若有关联记录,则不允许主表删除或修改。
SET NULL:主表删除或修改主表记录时,从表会将关联记录的外键字段设为null。
ON UPDATE CASCADE:主表修改记录时,从表关联记录的外键字段也会修改。(将CASCADE改为RESTRICT,意思相反)
ON DELETE CASCADE:主表删除记录时,从表关联记录的外键字段也会删除。(将CASCADE改为RESTRICT,意思相反)
外键约束创建
创建两个表,主表为class,从表为students
主表:
mysql> create table class(
xuehao int primary key,
name varchar(6))engine=innodb;
从表:
mysql> create table students(
id int auto_increment primary key,
uid int not null,
name varchar(6) not null,
foreign key(uid) references class(xuehao)
on update cascade on delete cascade)engine=innodb;
插入数据,进行测试
mysql> insert into class values(111,'张三'),(222,'李四'),(333,'王五');
mysql> insert into students values(1,111,'张三'),(2,222,'李四'),(3,333,'王五');
查看创建的记录
mysql> select * from class;
+--------+--------+
| xuehao | name |
+--------+--------+
| 111 | 张三 |
| 222 | 李四 |
| 333 | 王五 |
+--------+--------+
mysql> select * from students;
+----+-----+--------+
| id | uid | name |
+----+-----+--------+
| 1 | 111 | 张三 |
| 2 | 222 | 李四 |
| 3 | 333 | 王五 |
+----+-----+--------+
验证外键约束特性,删除从表中id为1的记录
mysql> delete from students where id=1;
mysql> select * from students;
+----+-----+--------+
| id | uid | name |
+----+-----+--------+
| 2 | 222 | 李四 |
| 3 | 333 | 王五 |
+----+-----+--------+
mysql> select * from class;
+--------+--------+
| xuehao | name |
+--------+--------+
| 111 | 张三 |
| 222 | 李四 |
| 333 | 王五 |
+--------+--------+
从表中删除记录不会对主表造成影响。(从删主不删)
在主表中删除学号为111的记录
mysql> insert into students values(1,111,'张三'); 将删除的记录从新插入
mysql> select * from students;
+----+-----+--------+
| id | uid | name |
+----+-----+--------+
| 1 | 111 | 张三 |
| 2 | 222 | 李四 |
| 3 | 333 | 王五 |
+----+-----+--------+
mysql> delete from class where xuehao=111;
mysql> select * from students;
+----+-----+--------+
| id | uid | name |
+----+-----+--------+
| 2 | 222 | 李四 |
| 3 | 333 | 王五 |
+----+-----+--------+
2 rows in set (0.00 sec)
主表的修改根据属性会对从表造成影响。(主删从不见)
mysql> insert into students values(4,444,'赵六');
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`test2`.`students`, CONSTRAINT `students_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `class` (`xuehao`) ON DELETE CASCADE ON UPDATE CASCADE)
无法插入主键关联中不存在的记录。(class表的xuehao字段中没有444,所以与其关联的students表中uid为444的记录也无法插入)
只有主表存在,从表才可插入,解决方案就是给主表插入xuehao为444的字段。
mysql> insert into class values(444,'赵六');
mysql> insert into students values(4,444,'赵六');
mysql> select * from students;
+----+-----+--------+
| id | uid | name |
+----+-----+--------+
| 2 | 222 | 李四 |
| 3 | 333 | 王五 |
| 4 | 444 | 赵六 |
+----+-----+--------+
修改创建外键约束
语法:
alter table 表名 add constraint `外键名称` foreign key (外键字段)references 主表(主键) 属性);
将之前的students表删除,从新创建。
mysql> drop table students;
mysql> create table students(id int primary key auto_increment,uid int not null,name varchar(6) not null);
将其修改为class表的外键约束
mysql> alter table students add foreign key(uid) references class(xuehao) on update cascade on delete cascade;
通过查看表执行命令,即可查询外键约束是否创建完成
mysql> show create table students\G
*************************** 1. row ***************************Table: students
Create Table: CREATE TABLE `students` (`id` int(11) NOT NULL AUTO_INCREMENT,`uid` int(11) NOT NULL,`name` varchar(6) NOT NULL,PRIMARY KEY (`id`),KEY `uid` (`uid`),CONSTRAINT `students_ibfk_1` FOREIGN KEY (`uid`) REFERENCES `class` (`xuehao`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8
其中CONSTRAINT `students_ibfk_1`字样就是外键的名称,没有手动指定,外键名称是数据库设置的,在删除外键时会用到外键名称。
删除外键
语法:
alter table 表名 drop foreign key 外键名称;
将创建的外键删除
mysql> alter table students drop foreign key students_ibfk_1;
再次查看创建表的命令,发现与外键相关的设置消失了
mysql> show create table students\G
*************************** 1. row ***************************Table: students
Create Table: CREATE TABLE `students` (`id` int(11) NOT NULL AUTO_INCREMENT,`uid` int(11) NOT NULL,`name` varchar(6) NOT NULL,PRIMARY KEY (`id`),KEY `uid` (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
完整格式创建
在之前的举例创建中,偷懒将可以省略的外键名称设置给省略了,为外键设置一个名称,在删除的时候还是比较方便的,系统自动创建的有点长。
删除原students表
mysql> drop table students;
从新创建,并且建立外键
mysql> create table students(-> id int primary key auto_increment,-> uid int not null,-> name varchar(6) not null,-> constraint `qwq` foreign key (uid) references class(xuehao)-> on update cascade on delete cascade-> )engine=innodb;
MySQL外键约束(FOREIGN KEY)是什么?相关推荐
- MySQL外键约束-foreign key
一.什么是外键 外键也称之为外键约束 : 关键字 foreign key 外键:外面的键,一张表的一个字段(非主键)指向另外一个表的主键, 那么该字段就称之为外键. 外键所在的表称之为子表(附表) ...
- Mysql外键约束foreign key
2019独角兽企业重金招聘Python工程师标准>>> 前提:使用外键功能,存储引擎需为InnoDb类型: 一.建表时同时创建外键 1.情景,班级表 和 学生表,一对多的关系. 2. ...
- 外键约束(foreign key) [MySQL][数据库]
外键约束(FOREIGN KEY(字段) REFERENCES 主表名(字段)) 外键约束的作用: 限定某个字段的引用完整性 我们之前在讲数据完整性的时候就提到过引用完整性 引用完整性(eg: 员工所 ...
- SQL约束(主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)
注意: A.表中有数据不能创建约束 B.视图下设置后,要点击保存(只有保存后在才看的到) c 别忘了,点刷新,才会出来呀! 1.主键约束 primary key 主键是每行的唯一标识符,仅仅通过它 ...
- mysql外键约束cascade_mysql外键约束foreign key ON DELETE CASCADE ON UPDATE CASCADE
正 文: 一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整 ...
- mysql外键(FOREIGN KEY)简单讲解与演示
前言 上数据库遇到了个叫外键的东西,一开始不是很懂,后来懂了,故记录一下... 外键是什么 外键,即外部的键 ,用来保证数据一致性,那么什么是数据的一致性呢? 假设某带学有如下两张表,描述,学生和专业 ...
- mysql 外键(foreign key)的详解和实例
一.基本概念 1.MySQL中"键"和"索引"的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用 ...
- mysql 外键约束_MySQL之外键约束(FOREIGN KEY)
定义: MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键. 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每 ...
- mysql外键约束怎么写_mysql外键约束怎么写
mysql外键约束的写法:[[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1].外键约束是表的一个特殊字段,经常与主键约束一起使用. 在 CREATE TAB ...
- mysql外键名_MySQL外键(foreign key)使用及说明详解
外键也称之为外键约束: foreign key 外键: 外面的键, 一张表的一个字段(非主键)指向另外一个表的主键, 那么该字段就称之为外键. 外键所在的表称之为子表(附表); 外键所指向的主键所在的 ...
最新文章
- 如何在自己的信息管理系统里集成第三方权限控制组件 - 设计一个漂亮的WEB界面...
- ftp工具之本地操作命令
- geth测试私链挖矿时发现很很慢,提高速度
- 斯坦福大学机器学习——高斯判别分析
- 保定有国家承认的计算机学校吗,河北省122所大学名单,不在名单内的都是国家不承认的野鸡学校...
- 我的15年操作系统开源路——RT-Thread 创始人熊谱翔
- React Redux: 从文档看源码 - Components篇
- 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量
- 2009年11月14日上海讲座-Linux触摸屏驱动PPT
- 层次分析法(AHP)——MATLAB在数学建模中的应用(第2版)
- 快速理解色彩搭配的三个配色知识
- linux如何伪装ip,如何伪装你的IP(二)
- 摄氏度和开氏度的换算_摄氏温度和华氏、开氏温度_温度表示符号及单位换算...
- Photoshop钢笔工具抠图和图层填充
- 计算机专业答辩系统抄袭怎么办,计算机毕业设计答辩怎么老是不过?
- Latex overleaf 图表公式参考文献
- Confluence和JIRA区别
- 带属性随机游走的图循环网络
- PHP面试题(个人总结)————(暂不更新)
- JavaSE中的方法
热门文章
- Eternity 《天长地久》
- 电子健康档案:实现医疗信息的有效共享
- Intel MIC (至强融核) 安装步骤
- Kaggle图像识别竞赛 Plant Seedlings Classification(植物幼苗分类)具体实现
- 史帝奇动感影院技术|4D特效影院|4D电影院的建造要求
- CSS常见的居中方法
- python入门教程慕课网_秒懂系列 | 史上最简单的Python Django入门教程
- Android学习-指南针(方向传感器)
- 根据State筛选数据表格
- 【高并发高性能高可用之海量数据MySQL实战-3】-MySQL逻辑架构图