向导

  • 外键约束
  • 外键创建规则
  • 创建外键约束语法
  • 外键约束创建
    • 修改创建外键约束
    • 删除外键
    • 完整格式创建

外键约束

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)是什么?相关推荐

  1. MySQL外键约束-foreign key

    一.什么是外键 外键也称之为外键约束 :  关键字  foreign key 外键:外面的键,一张表的一个字段(非主键)指向另外一个表的主键, 那么该字段就称之为外键. 外键所在的表称之为子表(附表) ...

  2. Mysql外键约束foreign key

    2019独角兽企业重金招聘Python工程师标准>>> 前提:使用外键功能,存储引擎需为InnoDb类型: 一.建表时同时创建外键 1.情景,班级表 和 学生表,一对多的关系. 2. ...

  3. 外键约束(foreign key) [MySQL][数据库]

    外键约束(FOREIGN KEY(字段) REFERENCES 主表名(字段)) 外键约束的作用: 限定某个字段的引用完整性 我们之前在讲数据完整性的时候就提到过引用完整性 引用完整性(eg: 员工所 ...

  4. SQL约束(主键约束 primary key、外键约束 foreign key、唯一约束unique 、CHECK约束)

    注意: A.表中有数据不能创建约束 B.视图下设置后,要点击保存(只有保存后在才看的到) c   别忘了,点刷新,才会出来呀! 1.主键约束 primary key 主键是每行的唯一标识符,仅仅通过它 ...

  5. mysql外键约束cascade_mysql外键约束foreign key ON DELETE CASCADE ON UPDATE CASCADE

    正 文: 一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整 ...

  6. mysql外键(FOREIGN KEY)简单讲解与演示

    前言 上数据库遇到了个叫外键的东西,一开始不是很懂,后来懂了,故记录一下... 外键是什么 外键,即外部的键 ,用来保证数据一致性,那么什么是数据的一致性呢? 假设某带学有如下两张表,描述,学生和专业 ...

  7. mysql 外键(foreign key)的详解和实例

    一.基本概念 1.MySQL中"键"和"索引"的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用 ...

  8. mysql 外键约束_MySQL之外键约束(FOREIGN KEY)

    定义: MySQL外键约束(FOREIGN KEY)用来在两个表的数据之间建立链接,它可以是一列或者多列.一个表可以有一个或多个外键. 外键对应的是参照完整性,一个表的外键可以为空值,若不为空值,则每 ...

  9. mysql外键约束怎么写_mysql外键约束怎么写

    mysql外键约束的写法:[[CONSTRAINT ] FOREIGN KEY 字段名 REFERENCES 主键列1].外键约束是表的一个特殊字段,经常与主键约束一起使用. 在 CREATE TAB ...

  10. mysql外键名_MySQL外键(foreign key)使用及说明详解

    外键也称之为外键约束: foreign key 外键: 外面的键, 一张表的一个字段(非主键)指向另外一个表的主键, 那么该字段就称之为外键. 外键所在的表称之为子表(附表); 外键所指向的主键所在的 ...

最新文章

  1. 如何在自己的信息管理系统里集成第三方权限控制组件 - 设计一个漂亮的WEB界面...
  2. ftp工具之本地操作命令
  3. geth测试私链挖矿时发现很很慢,提高速度
  4. 斯坦福大学机器学习——高斯判别分析
  5. 保定有国家承认的计算机学校吗,河北省122所大学名单,不在名单内的都是国家不承认的野鸡学校...
  6. 我的15年操作系统开源路——RT-Thread 创始人熊谱翔
  7. React Redux: 从文档看源码 - Components篇
  8. 网络流(最大流) CQOI 2015 BZOJ 3931 网络吞吐量
  9. 2009年11月14日上海讲座-Linux触摸屏驱动PPT
  10. 层次分析法(AHP)——MATLAB在数学建模中的应用(第2版)
  11. 快速理解色彩搭配的三个配色知识
  12. linux如何伪装ip,如何伪装你的IP(二)
  13. 摄氏度和开氏度的换算_摄氏温度和华氏、开氏温度_温度表示符号及单位换算...
  14. Photoshop钢笔工具抠图和图层填充
  15. 计算机专业答辩系统抄袭怎么办,计算机毕业设计答辩怎么老是不过?
  16. Latex overleaf 图表公式参考文献
  17. Confluence和JIRA区别
  18. 带属性随机游走的图循环网络
  19. PHP面试题(个人总结)————(暂不更新)
  20. JavaSE中的方法

热门文章

  1. Eternity 《天长地久》
  2. 电子健康档案:实现医疗信息的有效共享
  3. Intel MIC (至强融核) 安装步骤
  4. Kaggle图像识别竞赛 Plant Seedlings Classification(植物幼苗分类)具体实现
  5. 史帝奇动感影院技术|4D特效影院|4D电影院的建造要求
  6. CSS常见的居中方法
  7. python入门教程慕课网_秒懂系列 | 史上最简单的Python Django入门教程
  8. Android学习-指南针(方向传感器)
  9. 根据State筛选数据表格
  10. 【高并发高性能高可用之海量数据MySQL实战-3】-MySQL逻辑架构图