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.
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);
如果你愿意尝试
它可能会告诉您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。
我建议您尝试删除键,然后是外键,然后是列。