无法使用 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
我尝试应用 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