MySQL外键约束(FOREIGN KEY)

公子初心
2024-01-19 / 2 评论 / 37 阅读 / 正在检测是否收录...

1. 外键概述

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。
外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。
如果不是特别理解什么是主表,什么是从表 请查看下面2建表中的内容
主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

1.1 CASCADE 级联操作

  • ON DELETE CASCADE 删除时级联 ,删除主表 从表对应记录随之删除
  • ON UPDATE CASCADE 修改时级联 , 修改主表 从表对应记录随之修改

1.2 RESTRICT 严格模式

  • ON DELETE RESTRICT 删除时严格 ,删除主表 从表对应记录存在则主表不允许删除
  • ON UPDATE RESTRICT 修改时严格 , 修改主表 从表有对应记录则主表不允许修改

1.3 常规操作

  • ON DELETE RESTRICT 删除时严格 ,删除主表 从表对应记录存在则主表不允许删除
  • ON UPDATE CASCADE 修改时级联 , 修改主表 从表对应记录随之修改

1.4 定义外键时,需要遵守下列规则:

  • 主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
  • 必须为主表定义主键。
  • 主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。
  • 在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。
  • 外键中列的数目必须和主表的主键中列的数目相同。
  • 外键中列的数据类型必须和主表主键中对应列的数据类型相同。

2. 建表

一张专业表,一张学生表,如下图所示
lrkli6t4.png
lrklic80.png
专业表为主表(父表)学生表为从表(子表),学生表的mid为外键关联专业表的id
从以上截图大家不难看出,想要实现外键约束必须要求这两张表的引擎为 innodb

2.1 使用sql语句建表时设置表引擎为innodb

  create table major(
  id int primary key auto_increment,
  major_name varchar(20)
  )engine=innodb;

2.2 使用navicat for mysql建表时候设置表引擎为innodb

lrkljys8.png

3. SQL添加外键

3.1 在创建表时设置外键约束

CREATE TABLE student(
    id INT(11) PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(25),
    mid INT(11),
    CONSTRAINT f1
    FOREIGN KEY(mid) REFERENCES major(id) ON DELETE CASCADE ON UPDATE CASCADE
    )ENGINE=INNODB

3.2 表创建成功后添加外键约束

ALTER TABLE <数据表名> ADD CONSTRAINT <外键名>
FOREIGN KEY(<列名>) REFERENCES <主表名> (<列名>);

ALTER TABLE student ADD CONSTRAINT f1
FOREIGN KEY(mid) REFERENCES major (id) ON DELETE RESTRICT ON UPDATE CASCADE;

4. Navicat for MySQL 添加外键

lrklm218.png

5. 删除外键

5.1 sql命令删除

ALTER TABLE <表名> DROP FOREIGN KEY <外键约束名>;

ALTER TABLE student DROP FOREIGN KEY f1;

5.2 Navicat for MySQL 删除外键

lrkln1c3.png

2

评论 (2)

取消
  1. 头像
    你猜猜
    Windows 10 · Google Chrome

    谢谢老师,学会了已经月入2w了

    回复
    1. 头像
      111
      Windows 10 · Google Chrome
      @ 你猜猜

      那么牛的吗

      回复