前言
参考文章:
本以为是正常的外键设置,同时进行外键关联的操作。没想到有坑。
一、问题描述
product_info表
表中有个product_QR_code项,是我新建的order_info中需要关联的。即,需要通过order_info中的产品图号去关联product_info表中的product_QR_code。
我的order_info表的sql语句为:
CREATE TABLE order_info(
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单id',
`product_QR_code` VARCHAR(255) NOT NULL COMMENT '产品图号',
PRIMARY KEY(`id`),
FOREIGN KEY(`product_QR_code`) REFERENCES product_info(`product_QR_code`)
);
但是报错误为:1215 - Cannot add foreign key constraint
二、问题解决
分析
错误1215 - Cannot add foreign key constraint通常发生在以下几种情况:
- 数据类型不匹配:外键列和被引用的主键列的数据类型必须完全相同。
- 字符集或排序规则不一致:两个表的字符集或排序规则需要一致。
- 存储引擎不支持:确保两个表都使用支持外键约束的存储引擎(如InnoDB)。
- 被引用的列不是主键或唯一键:在product_info表中,product_QR_code列必须是唯一的或者作为主键的一部分。
而我的product_info表定义中,product_QR_code列是一个普通索引,而不是主键或唯一键。因此,不能直接将其用作外键。
解决方案
可以将product_QR_code列改为唯一键,或者创建一个新的唯一键列来作为外键。
方法一:将product_QR_code列改为唯一键
ALTER TABLE `product_info` ADD UNIQUE (`product_QR_code`);
方法二:添加一个新的唯一键列用于外键
ALTER TABLE `product_info` ADD COLUMN `unique_product_qr_code` VARCHAR(255) NOT NULL;
ALTER TABLE `product_info` ADD UNIQUE (`unique_product_qr_code`);
然后创建order_info表:
CREATE TABLE order_info(
`id` int(11) NOT NULL AUTO_INCREMENT COMMENT '订单id',
`product_QR_code` VARCHAR(255) NOT NULL COMMENT '产品图号',
PRIMARY KEY(`id`),
FOREIGN KEY(`product_QR_code`) REFERENCES product_info(`unique_product_qr_code`)
);
更新时间
- 2024.10.22:创建