wake-up-neo.com

MySQL Einige Fremdschlüssel entfernen

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 ich beim Versuch, eine der Fremdschlüsselspalten (dh locationIDX) zu löschen, einen Fehler erhalte.

"FEHLER 1025 (HY000): Fehler beim Umbenennen"

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

172
Drew

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

alter table footable drop foreign key fooconstraint
412
pugmarx

Die Fremdschlüssel dienen dazu, die Datenintegrität sicherzustellen, 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, die folgende Abfrage würde es tun:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;
21
zombat

Wie oben bereits erwähnt, können Sie einen FK ganz einfach löschen. Mir ist jedoch gerade aufgefallen, dass es notwendig sein kann, den KEY selbst irgendwann fallen zu lassen. Wenn Sie eine Fehlermeldung haben, um einen anderen Index wie den letzten zu erstellen, ist es nützlich, alles, was mit diesem Index zu tun hat, zu löschen.

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

Ü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!

8
norodin

Hier ist eine Möglichkeit, die Fremdschlüsseleinschränkung zu löschen. Sie funktioniert. ALTER TABLE location.location_id DROP FOREIGN KEY location_ibfk_1;

3

Dieser Fehler tritt normalerweise auf, wenn Ihre Tabellen die InnoDB-Engine verwenden. In diesem Fall müssten Sie den Fremdschlüssel löschen, dann die Alter-Tabelle ausführen und die Spalte löschen.

Der schwierige Teil ist jedoch, dass Sie den Fremdschlüssel nicht mithilfe des Spaltennamens löschen können, sondern stattdessen den Namen suchen müssen, der zum Indizieren verwendet wird. Um dies zu finden, geben Sie Folgendes ein:

SHOW CREATE TABLE region; Hier sollte eine Zeile angezeigt werden. Klicken Sie in der oberen linken Ecke auf die Option +, dann auf die Schaltfläche Volltext und dann auf Los. Dort wird der Name des Index angezeigt, in etwa wie folgt:

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:

ändern der Tabellenregion Löschen des Fremdschlüssels region_ibfk_1;

oder

einfacher gesagt, geben Sie Folgendes ein: - ändern Sie die Tabelle TableName. Löschen Sie den Fremdschlüssel Tabellenname_ibfk_1;

denken Sie daran, das einzige, was ist, hinzuzufügen _ibfk_1 Nach Ihrem Tabellennamen, um wie folgt zu machen: - TableName_ibfk_1

1
Abinash Hota

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

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

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
Jyothi M

Versuche dies:

alter table Documents drop
  FK__Documents__Custo__2A4B4B5E
0