无法删除索引'*”:外键约束中需要 -> 但是是哪一个?
P粉155710425
P粉155710425 2024-03-25 23:27:49
0
2
402

上下文

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

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

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);

P粉155710425
P粉155710425

全部回复(2)
P粉145543872

如果你愿意尝试

SHOW INDEXES FROM database_name.table_name;

它可能会告诉您fk_res_to_addr'是否真的被删除。

P粉068510991

我以前没有遇到过这个,但它太糟糕了,我怀疑可能存在 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

我建议您尝试删除键,然后是外键,然后是列。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板