记录 | 1553 - Cannot drop index ‘product_QR_code‘: needed in a foreign key constraint

项目场景:

order_info表中的product_QR_code项,已经被设置为外键,而且具有唯一性。

CREATE TABLE `order_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_number` varchar(255) NOT NULL ,
  `product_QR_code` varchar(255) NOT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE KEY `product_QR_code` (`product_QR_code`),
  CONSTRAINT `order_info_ibfk_1` FOREIGN KEY (`product_QR_code`) REFERENCES `product_info` (`product_QR_code`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

现在需要将其改为非唯一性,还是做为外键。


问题描述

直接采用删除其索引的方法:

ALTER TABLE order_info
DROP INDEX product_QR_code;

会报错为:1553 - Cannot drop index ‘product_QR_code’: needed in a foreign key constraint


原因分析:

在MySQL中,当你尝试删除一个索引(例如 product_QR_code),而该索引被用作外键约束的一部分时,会出现错误 1553 - Cannot drop index ‘product_QR_code’: needed in a foreign key constraint。这是因为外键约束依赖于该索引来维护数据的完整性。


解决方案:

需要先删除外键约束,然后再删除索引。

CREATE TABLE `order_info` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `order_number` varchar(255) NOT NULL ,
  `product_QR_code` varchar(255) NOT NULL ,
  PRIMARY KEY (`id`),
  UNIQUE KEY `product_QR_code` (`product_QR_code`),
  CONSTRAINT `order_info_ibfk_1` FOREIGN KEY (`product_QR_code`) REFERENCES `product_info` (`product_QR_code`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

1.删除外键约束:

首先,找到并删除与 product_QR_code 相关的外键约束。由上面的表创建代码可知外键约束的名称是 order_info_ibfk_1,使用以下语句删除它:

ALTER TABLE order_info DROP FOREIGN KEY order_info_ibfk_1;

2.删除索引:

然后,你可以删除 product_QR_code 列上的索引:

ALTER TABLE order_info DROP INDEX product_QR_code;

备注

  • 2024.10.24:创建