前言

如果一张表中有一个非主键的字段指向了另一张表中的主键,就将该字段叫做 外键
一张表中外键可以有多个,也就是不同字段指向了不同表中的主键。需要注意数据表的存储引擎必须为InnoDB,因为InnoDB提供事务支持以及外部键等高级数据库功能,相反的MyISAM不支持外键。
两个表必须是InnoDB表,MyISAM表暂时不支持外键。
外键是某个表中的一列,它包含在另一个表的主键中。
外键也是索引的一种,是通过一张表中的一列指向另一张表中的主键,来对两张表进行关联。
一张表可以有一个外键,也可以存在多个外键,与多张表进行关联。
父表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则父表与子表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。
必须为父表定义主键。
外键中列的数目必须和父表的主键中列的数目相同。
外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显式建立。
外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以;

1、在已有的表中添加外键

# 语法,其中,ON DELETE 和 ON UPDATE 表示事件触发限制
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}]
# 参数         意义
RESTRICT      限制外表中的外键改动(默认值,也是最安全的设置)
CASCADE       跟随外键改动
SET NULL      设为nullNO ACTION     无动作
SET DEFAULT   设为默认值

2、实例

# 先创建两张表,表引擎为 InnoDB 
CREATE TABLE student
(
  id int (11) primary key auto_increment,name char(255),sex char(255),age int(11)
) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
CREATE TABLE student_score
(
  id int (11) primary key auto_increment,class char(255),score char(255),student_id int(11)
) Engine = InnoDB CHARACTER SET utf8 COLLATE utf8_general_ci
# 创建外键
ALTER TABLE student_score ADD CONSTRAINT s_id FOREIGN KEY(student_id) REFERENCES student(id);
ALTER TABLE student_score ADD CONSTRAINT s_id FOREIGN KEY (student_id) REFERENCES student (id) ON DELETE CASCADE ON UPDATE CASCADE;
# 删除外键
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
ALTER TABLE student_score DROP FOREIGN KEY s_id;

3、作用

外键的主要作用是保证数据的一致性和完整性,并且减少数据冗余。主要体现在以下两个方面:
1、阻止执行
从表插入新行,其外键值不是主表的主键值便阻止插入。
从表修改外键值,新值不是主表的主键值便阻止修改。
主表删除行,其主键值在从表里存在便阻止删除(要想删除,必须先删除从表的相关行)。
主表修改主键值,旧值在从表里存在便阻止修改(要想修改,必须先删除从表的相关行)2、级联执行
主表删除行,连带从表的相关行一起删除。
主表修改主键值,连带从表相关行的外键值一起修改。
Logo

本社区面向用户介绍CSDN开发云部门内部产品使用和产品迭代功能,产品功能迭代和产品建议更透明和便捷

更多推荐