我在从一个表中删除一行时遇到问题。
我使用这些查询首先删除它的外键,然后删除键指向的列。
ALTER TABLE resources drop foreign key fk_res_to_addr; ALTER TABLE resources drop column address_id;
删除约束效果很好。删除列失败,并显示 Cannot drop index 'fk_res_to_addr': required in aforeign key constraint
。
我首先尝试(并且仍在尝试)找出仍然依赖于该索引的内容。我使用了这个查询(在此答案中找到):
SELECT TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME, REFERENCED_TABLE_NAME, REFERENCED_COLUMN_NAME FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE WHERE TABLE_SCHEMA = 'some_db' AND REFERENCED_TABLE_NAME = 'resources';
但是那里什么也没有。
然后我尝试禁用检查:
SET FOREIGN_KEY_CHECKS=0;
当然,然后重新启用它们。这也没有效果。
我还能做些什么来弄清楚什么取决于这个索引吗?我还缺少什么吗?
** 编辑 - 根据要求的表定义** 这是现在的表定义。正如您所看到的,address_id 现在有外键,但索引仍然存在。
create table resources ( id bigint auto_increment primary key, created bigint not null, lastModified bigint not null, uuid varchar(255) not null, description longtext null, internalName varchar(80) null, publicName varchar(80) not null, origin varchar(80) null, archived bigint unsigned null, contact_id bigint null, colorClass varchar(80) null, address_id bigint null, url mediumtext null, constraint uuid unique (uuid), constraint FK_contact_id foreign key (contact_id) references users (id) ) charset = utf8; create index fk_res_to_addr on resources (address_id); create index idx_resources_archived on resources (archived); create index idx_resources_created on resources (created);
如果你愿意尝试
它可能会告诉您fk_res_to_addr'是否真的被删除。
我以前没有遇到过这个,但它太糟糕了,我怀疑可能存在 mysql 错误。它在 mariadb 中“正常”工作。
您应该看到错误 Can't DROP 'fk_res_to_addr';检查列/键是否存在以及您报告的错误 - 请参阅 https://dbfiddle .uk/?rdbms=mysql_5.7&fiddle=c5b0bbc9d6c12f74e00ba8d059a15638
在创建时,mysql 使用您分配给 fk 的名称创建索引,并将其自己的名称分配给 fk。结果是上面提到的错误加上 https://dbfiddle.uk/?rdbms=mysql_5。 7&fiddle=c5b0bbc9d6c12f74e00ba8d059a15638。
我建议您尝试删除键,然后是外键,然后是列。