Ich muss meine vorhandene Datenbank ändern, um eine Spalte hinzuzufügen. Folglich möchte ich auch das Feld UNIQUE aktualisieren, um diese neue Spalte einzuschließen. Ich versuche, den aktuellen Index zu entfernen, erhalte aber weiterhin den FehlerMySQL Cannot drop index needed in a foreign key constraint
CREATE TABLE mytable_a (
ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;
CREATE TABLE mytable_b (
ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;
CREATE TABLE mytable_c (
ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;
CREATE TABLE `mytable` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`AID` tinyint(5) NOT NULL,
`BID` tinyint(5) NOT NULL,
`CID` tinyint(5) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `AID` (`AID`,`BID`,`CID`),
KEY `BID` (`BID`),
KEY `CID` (`CID`),
CONSTRAINT `mytable_ibfk_1` FOREIGN KEY (`AID`) REFERENCES `mytable_a` (`ID`) ON DELETE CASCADE,
CONSTRAINT `mytable_ibfk_2` FOREIGN KEY (`BID`) REFERENCES `mytable_b` (`ID`) ON DELETE CASCADE,
CONSTRAINT `mytable_ibfk_3` FOREIGN KEY (`CID`) REFERENCES `mytable_c` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB;
mysql> ALTER TABLE mytable DROP INDEX AID;
ERROR 1553 (HY000): Cannot drop index 'AID': needed in a foreign key constraint
UNIQUE KEY AID
auf mytable?Antworten:
Sie müssen den Fremdschlüssel fallen lassen. Fremdschlüssel in MySQL erstellen automatisch einen Index für die Tabelle (es gab eine SO-Frage zum Thema).
quelle
mytable
ADD CONSTRAINTmytable_ibfk_1
FOREIGN KEY (AID
) REFERENCESmytable_a
(ID
) ON DELETE CASCADE;FOREIGN KEY
Einschränkung anonym war?Schritt 1
Fremdschlüssel auflisten (HINWEIS, dass er sich vom Indexnamen unterscheidet)
Das Ergebnis zeigt Ihnen den Fremdschlüsselnamen.
Format:
Schritt 2
Drop-Schlüssel (Fremd / Primär / Schlüssel)
Schritt 3
Löschen Sie den Index.
quelle
Wenn Sie meinen, dass Sie dies tun können:
Aber dann:
gibt Fehler.
Sie können den Index löschen und einen neuen in einer
ALTER TABLE
Anweisung erstellen :quelle
Da Sie einen Index für ein Fremdschlüsselfeld haben müssen, können Sie einfach einen einfachen Index für das Feld 'AID' erstellen.
und erst dann den eindeutigen Index 'AID' löschen
quelle
Ein Fremdschlüssel erfordert immer einen Index. Ohne einen Index, der die Einschränkung erzwingt, wäre für jeden eingefügten oder aktualisierten Schlüssel in der Referenzierungstabelle ein vollständiger Tabellenscan in der referenzierten Tabelle erforderlich. Und das hätte inakzeptable Auswirkungen auf die Leistung. Dies hat die folgenden 2 Konsequenzen:
quelle
Ich denke, dies ist eine einfache Möglichkeit, den Index zu löschen.
quelle
FOREIGN_KEY_CHEK=0
und am EndeFOREIGN_KEY_CHEK=1
.In meinem Fall habe ich den Fremdschlüssel gelöscht und konnte den Index immer noch nicht löschen. Das lag daran, dass es in denselben Feldern noch eine andere Tabelle gab, die einen Fremdschlüssel für diese Tabelle hatte. Nachdem ich den Fremdschlüssel in der anderen Tabelle gelöscht hatte, konnte ich die Indizes in dieser Tabelle löschen.
quelle
Wenn Sie eine Fremdschlüsselspalte löschen möchten (wenn Sie eine Einschränkung haben), sollten Sie zuerst den Fremdschlüssel und dann die Spalte löschen. Wenn Sie den Fremdschlüssel löschen, müssen Sie nicht den gesamten Namen übergeben, sondern nur den Fremdschlüssel Spaltenname:
Weitere Details zu:
https://laravel.com/docs/6.x/migrations#foreign-key-constraints
quelle