外键是指一张表中的一列与另外一张表中的主键进行关联。一张表中可以有一个或多个外键(可以与多张表进行关联),同时外键也是一种索引。外键用来保证数据的一致性和完整性,减少数据冗余。

  • 阻止执行

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

  • 级联执行

主表删除行,连带从表的相关行一起删除。
主表修改主键值,连带从表相关行的外键值一起修改。
父表删除记录时候子表可以关联删除

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

1.创建外键
现有表添加外键

-- 这里的字段名用于从表的外键字段,所以要确保主表中的字段名要有索引
ALTER TABLE `主表名`ADD INDEX(`字段名`);
ALTER TABLE  `从表名` ADD CONSTRAINT `外键名称` FOREIGN KEY (`关联字段名[从表]`) REFERENCES `主表名` (`关联字段名[主表]`) ON DELETE [删除时约束] ON UPDATE [修改时约束];

创建表时添加外键

CREATE TABLE 主表名(
    id(主表主键) int unsigned auto_increment,
    ...
    PRIMARY KEY(id)
);
CREATE TABLE 从表名(
  id(从表主键) int unsigned auto_increment,
  ...
  关联字段名 int unsigned,
  PRIMARY KEY (id),
  CONSTRAINT 外键名称 FOREIGN KEY (`关联字段名[从表]`) REFERENCES `主表名` (`关联字段名[主表]`) ON DELETE [删除时约束] ON UPDATE [修改时约束]
);

2.删除外键

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

3.外键约束
主要是针对外键引用的列,有一下四种模式:

  • RESTRICT

与NO ACTION类似,立即检查外键约束,限制修改外键字段。

  • CASCADE

删除/更新主表记录时,从表中引用该值的记录也会自动被删除(记录)/更新(列)。

  • NO ACTION

从表中有引用,则不允许在主表中进行更新或删除

  • SET NULL

主表在删除或更新记录时,将从表上匹配记录的列设为null。从表的外键列不能为not null

参考文档:
https://blog.csdn.net/weixin_42056745/article/details/118395607

最后修改:2022 年 09 月 14 日
如果觉得我的文章对你有用,请随意赞赏