Failed to add the foreign key constraint 原因

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

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

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值