Index '*' kann nicht gelöscht werden: erforderlich -> in Fremdschlüsseleinschränkung, aber welcher?
P粉155710425
P粉155710425 2024-03-25 23:27:49
0
2
431

Kontext

Ich habe ein Problem beim Löschen einer Zeile aus einer Tabelle.

Ich verwende diese Abfragen, um zuerst den Fremdschlüssel und dann die Spalte zu löschen, auf die der Schlüssel verweist.

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

Das Entfernen von Einschränkungen funktioniert hervorragend. Das Löschen einer Spalte schlägt mit Cannot drop index 'fk_res_to_addr': required in aforeign key constraint fehl.

Was ich bisher versucht habe

Ich habe zunächst versucht (und versuche es immer noch), herauszufinden, was noch von diesem Index abhängt. Ich habe diese Abfrage verwendet (in dieser Antwort gefunden):

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

Aber da ist nichts.

Dann habe ich versucht, die Prüfung zu deaktivieren:

SET FOREIGN_KEY_CHECKS=0;

Natürlich, dann aktivieren Sie sie wieder. Auch das hat keine Auswirkung.

Kann ich sonst noch etwas tun, um herauszufinden, was von diesem Index abhängt? Vermisse ich etwas?

** BEARBEITEN – Tabellendefinition wie gewünscht** Dies ist die aktuelle Tabellendefinition. Wie Sie sehen, hat „address_id“ jetzt einen Fremdschlüssel, aber der Index ist immer noch vorhanden.

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

Antworte allen(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

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage