不能删除索引"*":在外键约束中需要 -> 但是哪一个呢?



上下文

我在从我们的一个表中删除一行时遇到问题。

我使用这些查询首先删除它的外键,然后删除键指向的列。

ALTER TABLE resources drop foreign key fk_res_to_addr;
ALTER TABLE resources drop column address_id;

删除约束效果很好。删除列失败,返回Cannot drop index 'fk_res_to_addr': needed in a foreign 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);

我以前没有遇到过这个问题,但它太糟糕了,我怀疑可能有mysql错误。它在马里亚德布"正常"工作。

您应该看到一个错误Can't DROP'fk_res_to_addr';检查列/键是否存在以及报告的错误-请参阅https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=c5b0bbc9d6c12f74e00ba8d059a15638

在create上,mysql用您分配给fk的名称创建一个索引,并将自己的名称分配给fk。结果是上面提到的错误加上https://dbfiddle.uk/?rdbms=mysql_5.7&fiddle=c5b0bbc9d6c12f74e00ba8d059a15638。

我建议你试着去掉键,然后去掉外键,然后去掉列。

如果您要尝试

SHOW INDEXES FROM database_name.table_name;

它可能会显示fk_res_to_addr'是否真的被删除了。

相关内容

  • 没有找到相关文章

最新更新