之前碰到过很多次,其主要原因是出现在建表时,关联表的关联属性没有建立索引值导致的。
CREATE TABLE address(
-> id SMALLINT UNSIGNED PRIMARY KEY,
-> name VARCHAR(20) NOT NULL
-> );
Query OK, 0 rows affected (0.43 sec)
CREATE TABLE teacher(
-> t_id TINYINT UNSIGNED PRIMARY KEY,
-> t_name VARCHAR(20) NOT NULL,
-> t_add VARCHAR(20) NOT NULL,
-> FOREIGN KEY (t_add) REFERENCES address(name) ON UPDATE CASCADE
-> );
ERROR 1822 (HY000): Failed to add the foreign key constraint. Missing index for constraint 'teacher_ibfk_1' in the referenced table 'address'
此时,查看表address的索引值

发现只有主键id的索引值,而属性name没有索引值,这就是无法实现外键约束的原因
此时,为属性name增加索引值
CREATE INDEX address_name ON address(name);
Query OK, 0 rows affected (0.13 sec)
查看以下表address的索引值

之后,重新建立表teacher,其中其t_add属性关联表address的name属性
CREATE TABLE teacher(
-> t_id TINYINT UNSIGNED PRIMARY KEY,
-> t_name VARCHAR(20) NOT NULL,
-> t_add VARCHAR(20) NOT NULL,
-> FOREIGN KEY (t_add) REFERENCES address(name) ON UPDATE CASCADE
-> );
Query OK, 0 rows affected (0.03 sec)
建表成功

总结一下:
创建外键约束的目的是保持数据一致性,完整性,以及实现一对一或一对多关系
创建外键约束的要求有以下几点: -- 1、父表和子表必须使用相同的存储引擎,而且禁止使用临时表 --具有外键列的表称为子表;子表所参照的表称为父表 -- 2、数据表的默认引擎只能为InnoDB -- 3、外键列和参照列必须具有类似的数据类型。其中数字的长度或是否有符号位必须相同,而字符的长度可以不同 -- 加FOREGIN KEY 关键字的列称为外键列 外键列所参照的列称为参照列 -- 4、外键列和参照列必须建立索引。如果外键列不存在索引的话,MYSQL将自动创建索引。如果参照列不存在索引的话,MySQL不会自动创建索引 -- MySQL会为主键自动创建索引 |