Muszę ZMIENIĆ moją istniejącą bazę danych, aby dodać kolumnę. W związku z tym chcę również zaktualizować pole UNIQUE, aby obejmowało tę nową kolumnę. Próbuję usunąć bieżący indeks, ale nadal pojawia się błądMySQL 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
mytable?Odpowiedzi:
Musisz upuścić klucz obcy. Klucze obce w MySQL automatycznie tworzą indeks w tabeli (było pytanie SO na ten temat).
źródło
mytable
ADD CONSTRAINTmytable_ibfk_1
FOREIGN KEY (AID
) REFERENCESmytable_a
(ID
) ON DELETE CASCADE;FOREIGN KEY
ograniczenie było anonimowe?Krok 1
Lista kluczy obcych (UWAGA, różni się od nazwy indeksu)
Wynik pokaże nazwę klucza obcego.
Format:
Krok 2
Upuść (obcy / podstawowy / klucz)
Krok 3
Upuść indeks.
źródło
Jeśli masz na myśli, że możesz to zrobić:
Ale wtedy:
daje błąd.
Możesz usunąć indeks i utworzyć nowy w jednej
ALTER TABLE
instrukcji:źródło
Ponieważ musisz mieć indeks w polu klucza obcego, możesz po prostu utworzyć prosty indeks w polu „AID”
i dopiero wtedy upuść unikalny indeks „AID”
źródło
Klucz obcy zawsze wymaga indeksu. Bez indeksu wymuszającego ograniczenie wymagałoby pełnego skanowania tabeli w tabeli, do której się odwołuje, dla każdego wstawionego lub zaktualizowanego klucza w tabeli odniesienia. A to miałoby niedopuszczalny wpływ na wydajność. Ma to następujące 2 konsekwencje:
źródło
Myślę, że to łatwy sposób na usunięcie indeksu.
źródło
FOREIGN_KEY_CHEK=0
i na końcuFOREIGN_KEY_CHEK=1
.W moim przypadku porzuciłem klucz obcy i nadal nie mogłem upuścić indeksu. To dlatego, że była jeszcze inna tabela, która miała klucz obcy do tej tabeli w tych samych polach. Po upuszczeniu klucza obcego na drugą tabelę mogłem upuścić indeksy na tej tabeli.
źródło
jeśli chcesz upuścić kolumnę klucza obcego (która trzyma ograniczenie) powinieneś najpierw upuścić klucz obcy, a następnie upuścić kolumnę, kiedy upuszczasz klucz obcy, nie musisz podawać całej nazwy, po prostu podaj klucz obcy Nazwa kolumny:
więcej szczegółów na temat:
https://laravel.com/docs/6.x/migrations#foreign-key-constraints
źródło