Failed to add the foreign key constraint 原因

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 16:15   1291   0

之前碰到过很多次,其主要原因是出现在建表时,关联表的关联属性没有建立索引值导致的。

 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会为主键自动创建索引

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP