版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
外键约束的要求:
- 父表和子表必须使用相同的存储引擎,而且禁止使用临时表。
- 数据表的存储引擎只能为InnoDB。
- 外键列和参照列必须具有相似的数据类型,也就是可以相互转换类型的列,比如 int 和 tinyint 可以,而 int 和 char 则不可以
- 数字类型的长度以及是否有符号(是否unsigned)必须相同
- 字符类型的长度则可以不同。
- 外键列和参照列必须创建索引。如果外键列不存在索引,MySQl将自动创建。
- 外键的名字不能重复
创建外键约束:
-
创建外键约束方法:
-
在创建时创建(如下面创建子表)
[CONSTRAINT 外键名] FOREIGN KEY (外键字段名) REFERENCES 父表名(参照字段名);
-
创建表后增加 ALTER 操作
ALTER TABLE 子表名 ADD [CONSTRAINT 外键名] FOREIGN KEY(外键字段名) REFERENCES 父表名(参照字段名);
注: [ ] 中的为可省略的,如果创建时省略不定义外键名,MySQl 将会自动命名;
-
-
创建表
父表: CREATE TABLE teacher ( course varchar(16) NOT NULL, teacher char(16) NOT NULL, PRIMARY KEY (course) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
子表: CREATE TABLE course ( id tinyint(3) unsigned NOT NULL AUTO_INCREMENT, course varchar(16) NOT NULL, PRIMARY KEY (id), FOREIGN KEY (course) REFERENCES teacher(course) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
字表中创建外键约束
- 父表(teacher 表)中 参照列(course字段)必须创建了索引
- 外键列(course表中的course字段)和参照列(teacher 表中的course字段必须具有相似的数据类型,这里都为
course varchar(16) NOT NULL //这里varchar(16) 也可以写为 char类型 ,且长度可以不一样 如 测试图-2
- 数据表的存储引擎相同,且只能为InnoDB
- 这里我们创建表时都加上 ENGINE=InnoDB 即可;
这样我们才可以创建成功:
测试图- 1
测试图- 2
反之 则会报错:Error Code: 1215. Cannot add foreign key constraint 0.468 sec
- 这里我们创建表时都加上 ENGINE=InnoDB 即可;
外键的定制作用 ---- 约束模式:
-
DISTRICT:严格模式(默认), 父表不能删除或更新一个被子表引用的记录;
-
CASCADE :级联模式, 父表操作后,子表关联的数据也跟着一起操作。也就是父表删除或更新后自动删除或更新子表中匹配的行;
-
SET NULL:置空模式, 父表操作后,子表对应的字段被置空,前提外键字段没有指定 NOT NULL ;
-
NO ACTION 标准的SQL 关键字,在 MySQl 中 作用与 DISTRICT 相同
-
SET DEFAULT 设默认值
所以完整语法:
[CONSTRAINT 外键名] FOREIGN KEY (外键字段名) REFERENCES 父表名(参照字段名);
[ON DELETE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO ACTION | SET DEFAULT}]
删除外键约束:
ALTER TABLE 表名 DROP FOREIGN KEY 外键名;
外键约束的作用:
- 对子表(外键所在的表)的作用:子表在进行写操作的时候,如果外键字段在父表中找不到对应的匹配,操作就会失败。
- 对父表的作用:对父表的主键字段进行删和改时,如果对应的主键在子表中被引用,操作就会失败。