无法使用 FOREIGN KEY 删除 MariaDB/MySql table 中的字段

Not able to drop field in MariaDB/MySql table with FOREIGN KEY

我尝试应用 similar question 中描述的解决方法,但没有成功。

在我的场景中有两个相关的 table;我希望从 table product.

中删除 ean_code 字段
CREATE TABLE `brand` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(512) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
CREATE TABLE `product` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  `ean_code` varchar(255) DEFAULT NULL,
  `brand_id` bigint(20) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `product_eancode_unique` (`brand_id`,`ean_code`),
  CONSTRAINT `fk_product_brand_id` FOREIGN KEY (`brand_id`) REFERENCES `brand` (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8;

正如@bill-karwin 所解释的那样,普通的 drop column 失败了:

> ALTER TABLE product drop column `ean_code`;
  Key column 'ean_code' doesn't exist in table

所以我尝试了建议的解决方法“在同一语句中同时删除唯一索引和字段”:

> ALTER TABLE `product` DROP KEY `product_eancode_unique`, DROP COLUMN  `ean_code`;
  Cannot drop index 'product_eancode_unique': needed in a foreign key constraint

我认为报告的错误很奇怪,因为给定字段不涉及两个 table 之间的任何关系;

我用所有可用的 mariadb 和 mysql 版本试验了 db<>fiddle,但并不愉快。

PS 我已经使用 db-fiddle 通过反复试验隔离了罪魁祸首约束,但 ant 数据库实例将完成这项工作(除了尝试不同的数据库版本)。

我自己发现的解决方法是“在删除索引和字段之前删除约束,然后重新创建约束”。

alter table `product` drop constraint `fk_product_brand_id`;
alter table `product` drop key `product_eancode_unique`, drop column `ean_code`;
alter table `product` add foreign key `fk_product_brand_id`(`brand_id`) REFERENCES `brand`(`id`)

如此 db-fiddle.

我仍然不知道如何快速隔离导致这一切的约束。

您不能删除该列,因为外键约束使用了该索引。您必须首先创建一个用于约束检查的索引,然后删除包含要删除的列的索引。然后该列可能会被删除。

ALTER TABLE product ADD INDEX (brand_id), 
                    DROP INDEX product_eancode_unique,  
                    DROP COLUMN `ean_code`;

https://dbfiddle.uk/?rdbms=mariadb_10.5&fiddle=f36688300eeff3af867872b0227981ac