外键约束
外键约束(也称为引用约束或引用完整性约束)用于定义数据表之间以及表内必需的关系;
外键是表中的一列或一组列,它的值需要与其父表的行的至少一个主键或唯一键值相匹配;
外键是用来实现参照完整性的,外键约束将可以使两张表紧密的结合起来,特别是修改或者删除的级联操作将使得日常的维护工作更加轻松;
外键约束使用条件
父表和子表必须具有相同的存储引擎,且不能为临时表;
MySQL的存储引擎中只有InnoDB类型才支持外键约束;
外键列和参照列必须具有相似的数据类型,其中数字的长度或是否有符号位必须相同;而字符的长度则可以不同,但字符集必须相同;
外键列和参照列必须创建索引,如果参照列不存在索引的话,MySQL将自动创建索引;
操作顺序的要求
在创建外键约束时,父表必须事先存在,然后才能创建外约束;
创建外键约束后,在子表中插入/更新记录时,只能使用主表中已经存在的记录;否则将显示CanNOT ADD OR updat a child row : a fOReign KEY cONstraINT fails ((xxx) FOREIGN KEY (xxx) REFERENCES xxx(xxx))的错误信息;
在删除数据表时,只能先删除子表,然后才能删除父表;否则将显示CanNOT delete OR upDATE a parent row:a fOReign KEY cONstraINT fails的错误信息;
创建外键约束
通过CREATE TABLE/ALTER TABLE语句进行创建数据表/修改数据表时,通过以下子句来定义外键约束:
[ CONSTRAINT ] FOREIGN KEY (INDEX_col_name, ...)
REFERENCES tbl_name (INDEX_col_name,...)
-- 创建数据表时添加外键约束
CREATE TABLE goods_type(
type_id SMALLINT UNSIGNED KEY AUTO_INCREMENT,
type_name VARCHAR(30) NOT NULL
);
CREATE TABLE goods(
goods_id MEDIUMINT UNSIGNED KEY AUTO_INCREMENT,
goods_name VARCHAR(80) NOT NULL,
type_id SMALLINT UNSIGNED NOT NULL,
FOREIGN KEY (type_id) REFERENCES goods_type(type_id)
);