Eu preciso ALTERAR meu banco de dados existente para adicionar uma coluna. Consequentemente, também quero atualizar o campo UNIQUE para abranger essa nova coluna. Estou tentando remover o índice atual, mas continuo recebendo o erroMySQL 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
minha tabela?Respostas:
Você precisa soltar a chave estrangeira. Chaves estrangeiras no MySQL criam automaticamente um índice na tabela (havia uma pergunta SO no tópico).
fonte
mytable
ADD CONSTRAINTmytable_ibfk_1
FOREIGN KEY (AID
) REFERÊNCIASmytable_a
(ID
) ON DELETE CASCADE;FOREIGN KEY
restrição for anônima?Passo 1
Listar chave estrangeira (NOTE que é diferente do nome do índice)
O resultado mostrará o nome da chave estrangeira.
Formato:
Passo 2
Tecla Drop (estrangeira / principal / chave)
etapa 3
Solte o índice.
fonte
Se você quer dizer que pode fazer isso:
Mas então:
dá erro.
Você pode soltar o índice e criar um novo em uma
ALTER TABLE
instrução:fonte
Como você precisa ter um índice em um campo de chave estrangeira, basta criar um índice simples no campo 'AID'
e só então solte o índice exclusivo 'AID'
fonte
Uma chave estrangeira sempre exige um índice. Sem um índice que imponha a restrição, seria necessária uma verificação completa da tabela na tabela referenciada para cada chave inserida ou atualizada na tabela de referência. E isso teria um impacto inaceitável no desempenho. Isso tem as seguintes 2 consequências:
fonte
Eu acho que essa é uma maneira fácil de eliminar o índice.
fonte
FOREIGN_KEY_CHEK=0
e no finalFOREIGN_KEY_CHEK=1
.No meu caso, larguei a chave estrangeira e ainda não consegui largar o índice. Isso ocorreu porque havia mais uma tabela que tinha uma chave estrangeira para essa tabela nos mesmos campos. Depois de soltar a chave estrangeira na outra tabela, eu poderia soltar os índices nessa tabela.
fonte
se você deseja soltar uma coluna de chave estrangeira (o que mantém uma restrição), você deve soltar a chave estrangeira primeiro e depois soltar a coluna; quando você solta a chave estrangeira, não precisa passar todo o nome, basta passar a chave estrangeira nome da coluna:
mais detalhes sobre:
https://laravel.com/docs/6.x/migrations#foreign-key-constraints
fonte