MySQL Entfernen einiger Fremdschlüssel


189

Ich habe eine Tabelle, deren Primärschlüssel in mehreren anderen Tabellen verwendet wird und die mehrere Fremdschlüssel für andere Tabellen enthält.

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

Das Problem ist, dass beim Versuch, eine der Fremdschlüsselspalten (z. B. locationIDX) zu löschen, ein Fehler auftritt.

"FEHLER 1025 (HY000): Fehler beim Umbenennen"

Wie kann ich die Spalte in der obigen Zuordnungstabelle löschen, ohne diesen Fehler zu erhalten?

Antworten:


446

Wie hier erläutert , muss die Fremdschlüsseleinschränkung nach dem Einschränkungsnamen und nicht nach dem Indexnamen gelöscht werden . Die Syntax lautet:

alter table footable drop foreign key fooconstraint

35
Das war mein Problem. Ich fühle mich jetzt irgendwie dumm. Wenn jemand anderes dieses Problem hat, können Sie die Namen der Fremdschlüsseleinschränkung mithilfe der Funktion SHOW CREATE TABLE finden.
Drew

14
Tipp: Verwenden SHOW CREATE TABLE footable;Sie diese Option, um den Namen der Einschränkung anzuzeigen. Es ist nicht der Name der Spalte an sich. Danke für die Antwort!
Chris Baker

2
Sie können dies verwenden, um Fremdschlüsseleinschränkungen zu finden: SELECT * FROM information_schema.table_constraints WHERE Constraint_schema = '<Ihr Datenbankname>' AND Constraint_type = 'FOREIGN KEY'
Gayan Dasanayake

21

Die Fremdschlüssel dienen der Datenintegrität, sodass Sie eine Spalte nicht löschen können, solange sie Teil eines Fremdschlüssels ist. Sie müssen zuerst den Schlüssel fallen lassen.

Ich würde denken, dass die folgende Abfrage es tun würde:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

Wie bereits erwähnt, können Sie einen FK problemlos löschen. Ich habe jedoch gerade bemerkt, dass es notwendig sein kann, den SCHLÜSSEL selbst irgendwann fallen zu lassen. Wenn Sie eine Fehlermeldung haben, um einen anderen Index wie den letzten zu erstellen, meine ich mit demselben Namen, wäre es nützlich, alles zu löschen, was mit diesem Index zusammenhängt.

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

Überprüfen Sie, wie der Name CONSTRAINT und der Name FOREIGN KEY lauten:

SHOW CREATE TABLE table_name;

Entfernen Sie sowohl den Namen CONSTRAINT als auch den Namen FOREIGN KEY:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

Hoffe das hilft!


4

Hier ist eine Möglichkeit, die Fremdschlüsseleinschränkung aufzuheben. Es wird funktionieren. ALTER TABLE location. location_id DROP FOREIGN KEY location_ibfk_1;


2

Hey, ich bin einer Sequenz oben gefolgt und habe eine Lösung gefunden.

SHOW CREATE TABLE footable;

Sie erhalten FK Constrain Name wie

ProjectsInfo_ibfk_1

Jetzt müssen Sie diese Einschränkungen entfernen. von alter table commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

Dann lassen Sie die Tabellenspalte fallen,

alter table ProjectsInfo drop column clientId;

1

Normalerweise wird dieser Fehler angezeigt, wenn Ihre Tabellen die InnoDB-Engine verwenden. In diesem Fall müssten Sie den Fremdschlüssel löschen, dann die Änderungstabelle ausführen und die Spalte löschen.

Der schwierige Teil ist jedoch, dass Sie den Fremdschlüssel nicht mit dem Spaltennamen löschen können, sondern stattdessen den Namen suchen müssen, der zum Indizieren verwendet wird. Um dies zu finden, geben Sie die folgende Auswahl ein:

SHOW CREATE TABLE-Region; Dies sollte Ihnen eine Zeile anzeigen. Klicken Sie in der linken oberen Ecke auf die Option +, klicken Sie auf die Volltext-Raio-Schaltfläche und dann auf Los. Dort erhalten Sie den Namen des Index.

CONSTRAINT region_ibfk_1 AUSLÄNDISCHER SCHLÜSSEL (country_id) REFERENZEN country (id) ON DELETE NO ACTION ON UPDATE NO ACTION Geben Sie jetzt einfach Folgendes aus:

alter table region drop fremdschlüssel region_ibfk_1;

oder

Einfacher geben Sie einfach Folgendes ein: - alter table TableName drop fremdschlüssel TableName_ibfk_1 ;

Denken Sie daran, dass Sie nach Ihrem Tabellennamen nur _ibfk_1 hinzufügen müssen , um Folgendes zu erstellen : - Tabellenname _ibfk_1


0

Sie können die Fremdschlüsselspalte nicht löschen, da auf sie aus der Tabelle verwiesen wird assignmentStuff. Sie sollten also zuerst die Fremdschlüsseleinschränkung löschen assignmentStuff.assignmentIDX.

Eine ähnliche Frage bereits gestellt hier . Überprüfen Sie auch hier für weitere Informationen.


1
Da assignStuff auf den Primärschlüssel der Zuweisung verweist, kann ich die locationID-Spalte der Zuweisung nicht löschen. Dies scheint irgendwie kontraintuitiv zu sein.
Drew

Anscheinend habe ich einige Spaltennamen geändert, sodass meine Antwort keinen Sinn ergibt. Entschuldigung dafür ...
Ronald Wildenberg


0

Schritt 1: show create table vendor_locations;

Schritt 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

es hat bei mir funktioniert.


0

Zuerst muss der tatsächliche Einschränkungsname durch diese Abfrage abgerufen werden

SHOW CREATE TABLE TABLE_NAME

Diese Abfrage führt dazu, dass der Name des Fremdschlüssels eingeschränkt wird. Unter der Abfrage wird er nun gelöscht.

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

Die letzte Nummer im obigen Einschränkungsnamen hängt davon ab, wie viele Fremdschlüssel Sie in der Tabelle haben

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.