引言
在MySQL中,我们都对主键比较了解,知道主键的主要作用是唯一区分表中的各个行;但是,对于外键(foreign key) 比较陌生。那么什么是外键呢?外键的作用是什么呢?

一、外键、外键作用及其限制条件

1.外键的定义:
外键是某个表中的一列,它包含在另一个表的主键中。
外键也是索引的一种,是通过一张表中的一列指向另一张表中的主键,来对两张表进行关联。
一张表可以有一个外键,也可以存在多个外键,与多张表进行关联。
2.外键的作用:
外键的主要作用是保证数据的一致性和完整性,并且减少数据冗余。主要体现在以下两个方面:

阻止执行

从表插入新行,其外键值不是主表的主键值便阻止插入。
从表修改外键值,新值不是主表的主键值便阻止修改。
主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行)。
主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)。
级联执行

主表删除行,连带从表的相关行一起删除。
主表修改主键值,连带从表相关行的外键值一起修改。
3.外键创建限制
父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
必须为父表定义主键。
外键中列的数目必须和父表的主键中列的数目相同。
两个表必须是InnoDB表,MyISAM表暂时不支持外键。
外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立。
外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

二、外键创建方法

可以在创建表时创建外键,也可以在已有的表中增加外键。我们主要讲第二种方式创建外键。

1.创建外键的语法

ALTER TABLE 表名 ADD CONSTRAINT 外键名 FOREIGN KEY(外键字段名)
REFERENCES 外表表名(主键字段名)
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]

其中,ON DELETE 和 ON UPDATE表示事件触发限制,各参数意义如下:

参数 意义
RESTRICT 限制外表中的外键改动(默认值,也是最安全的设置)
CASCADE 跟随外键改动
SET NULL 设为null值
NO ACTION 无动作
SET DEFAULT 设为默认值

2.举例
(1)创建两张表:

CREATE TABLE student
(id int (11) primary key auto_increment,name char(255),sex char(255),age int(11)
)charset utf8;CREATE TABLE student_score
(id int (11) primary key auto_increment,class char(255),score char(255),student_id int(11)
)charset utf8;

(2)创建外键:

ALTER TABLE student_score ADD CONSTRAINT s_id FOREIGN KEY(student_id)
REFERENCES student(id);

(3)查看表结构

SHOW CREATE TABLE student;
SHOW CREATE TABLE student_score;

三、验证外键作用

1.先向主表中添加数据

再向从表中添加数据(从表中的外键已在主表中存在),正常运行

#向student表中添加数据
INSERT INTO
student(name,sex,age)
VALUES('小明','男','20');#向student_score表中添加数据
INSERT INTO student_score(class,score,student_id)
VALUES('语文','100',1),('数学','99',1),('英语','98',1);

数据插入正常,无报错、警告信息。

2.在事件触发限制使用默认值RESTRICT的情况下

(1)向从表插入新行,外键值不在主表中,被阻止

INSERT INTO student_score(class,score,student_id) VALUES('语文','100',2);

(2)从表修改外键值,新值不是主表的主键值,阻止修改

UPDATE student_score SET student_id = 2 WHERE student_id = 1;

(3)主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行)

DELETE FROM student WHERE id = 1;

(4)主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)

UPDATE student SET id = 2 WHERE id = 1;

3.更改事件触发限制为CASCADE

#删除旧的外键
ALTER TABLE student_score DROP FOREIGN KEY s_id;#添加新的外键,修改事件触发限制为CASCADE
ALTER TABLE student_score ADD CONSTRAINT s_id FOREIGN KEY(student_id)
REFERENCES student(id) ON DELETE CASCADE ON UPDATE CASCADE;

(1)查看表结构

SHOW CREATE TABLE student_score;

(2)查看此时两表中的数据

(3)此时,当主表修改主键值,从表中相关行的外键值将一起修改

UPDATE student SET id = 2 WHERE id = 1;

运行成功,查看两张表中的数据:

(4)如果主表删除行,从表中的相关行将一起被删除

DELETE FROM student WHERE id = 2;

运行成功,查看两张表中的数据:

4.所以,事件触发限制条件的不同,会造成两张表中的操作限制不同,其他几个限制条件相对好理解,大家可以自己进行尝试,体会其中的区别。
事件触发限制条件的不同,会造成两张表中的操作限制不同,其他几个限制条件相对好理解,大家可以自己进行尝试,体会其中的区别。

四、删除外键约束

1.语法

ALTER TABLE 表名 DROP FOREIGN KEY 外键名;ALTER TABLE student_score DROP FOREIGN KEY s_id;

MySQL中的外键(foreign key)相关推荐

  1. Java数据库foreign,mysql中的外键foreign key 作者:Java_xb

    一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败. 2.对父表的作用:对父表的主键字段进行 ...

  2. mysql中的foreignkey的作用_mysql中的外键foreign key

    一.如果一张表中有一个非主键的字段指向了别一张表中的主键,就将该字段叫做外键. 一张表中可以有多个外键. 外键的默认作用有两点: 1.对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段 ...

  3. 【MySQL】解决MySQL删除外键(foreign key)时报错问题

    [MySQL]解决MySQL删除外键(foreign key)时报错问题 文章目录 [MySQL]解决MySQL删除外键(foreign key)时报错问题 一.现象 二.分析 三.问题解决 四.拓展 ...

  4. 数据库六大约束用法:主键(primary key)、外键(foreign key)、非空(not null)、默认(default)、检查(check)、唯一(unique)

    1. 数据库有六大约束 主键(primary key) 外键(foreign key):被参照的键必须有唯一约束或是主键 非空(not null) 默认(default) 检查(check):orac ...

  5. mysql中的外键约束_MySQL外键约束

    在本教程中,您将了解MySQL外键(foreign key)以及如何在MySQL中创建,添加和删除外键约束. MySQL外键简介 外键表示一个表中的一个字段被另一个表中的一个字段引用.外键对相关表中的 ...

  6. MySQL中包含外键无法删除数据的解决方案

    1.在数据库连接信息加入以下代码,意思就是允许执行多语句查询. allowMultiQueries=true 2.在删除语句前面加上SET FOREIGN_KEY_CHECKS=0; 意思就是取消My ...

  7. MYSQL外键(Foreign Key)的使用

    在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持 ...

  8. mysql foreign key_MYSQL外键(Foreign Key)的使用

    在MySQL 3.23.44版本后,InnoDB引擎类型的表支持了外键约束. 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持 ...

  9. Mysql完整性约束详解(字段唯一,非空,主键primary key,外键foreign key,自增长auto_increment)

    引入 1.什么是完整性约束, 为什么使用 为了规范数据格式, 在用户进行插入.修改.删除等操作时,DBMS(数据库管理系统(Data Base Management System))自动按照约束条件对 ...

最新文章

  1. mysql安装可能遇到的错误和安装过程
  2. 最新Django2.0.1在线教育零基础到上线教程(十四)- 全剧终
  3. where is list binding done for Opportunity S2 view default 20 returns
  4. kitti百度网盘分享 kitti百度云盘,全套kitti分享 自动驾驶
  5. ofo 押金被强制理财?黄章回应 OPPO 涉嫌抄袭;三星华为折叠手机重名 | 极客头条...
  6. php 函数频率,这是一些使用频率比较高的php函数……
  7. Linux驱动的platform机制
  8. python从键盘输入一个数、计算出大于n的最小素数_请问,可以帮忙做下这个题吗?--从键盘输入一个数,求大于该数的最小素数....
  9. 00后程序员摸爬滚打近一年,为学弟学妹们总结出了以下 7 条人生建议(建议收藏)
  10. 智能家居蓝海 如何才能破解“外热内冷”的尴尬?
  11. /Volumes/TeXLive2019/install-tl: No binary platform specified/available, quitting.
  12. Docker Swarm 练习:投票 App
  13. 边缘服务网格 osm-edge
  14. NOIP 2012 Senior 2 - 国王游戏
  15. Backtrader获得当前持仓详情——持仓数量与持仓的名称
  16. CentOS8搭建FTP服务器
  17. 【STM32+cubemx】0030 HAL库开发:DDS芯片AD9833实现简单的波形发生器
  18. 有了Prezi,你还在用PPT?
  19. 使用python对文件夹里的所有表格合并且去重
  20. BUAA OO Unit3总结

热门文章

  1. 8种常见的HTTP请求方式你知道多少?
  2. AChain (ACT)钱包安装 Ubuntu
  3. 国外医疗行业大数据应用解决之道
  4. MetaMask 连接其他网络
  5. android CameraX实现拍摄视频功能
  6. Flutter学习笔记之-圆形头像实现方式
  7. C++分布式框架研究(一)
  8. Android Studio编译报错:“ java.lang.OutOfMemoryError: Java heap space”
  9. 金融类APP产品:搭载运营手段提高用户数据指标
  10. oracle物化视图和表的区别,数据库中普通视图和物化视图有什么区别?