Necesito ALTERAR mi base de datos existente para agregar una columna. En consecuencia, también quiero actualizar el campo ÚNICO para abarcar esa nueva columna. Estoy tratando de eliminar el índice actual pero sigo recibiendo el errorMySQL 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
en mytable?Respuestas:
Tienes que soltar la clave foránea. Las claves externas en MySQL crean automáticamente un índice en la tabla (había una pregunta SO sobre el tema).
fuente
mytable
AGREGAR RESTRICCIÓNmytable_ibfk_1
CLAVE EXTRANJERA (AID
) REFERENCIASmytable_a
(ID
) EN ELIMINAR CASCADA;FOREIGN KEY
restricción es anónima?Paso 1
Listar clave externa (TEN EN CUENTA que es diferente del nombre del índice)
El resultado le mostrará el nombre de la clave externa.
Formato:
Paso 2
Tecla soltar (externa / primaria / clave)
Paso 3
Suelta el índice.
fuente
Si quiere decir que puede hacer esto:
Pero entonces:
da error
Puede soltar el índice y crear uno nuevo en una
ALTER TABLE
declaración:fuente
Como debe tener un índice en un campo de clave externa, puede crear un índice simple en el campo 'AID'
y solo entonces suelte el índice único 'AID'
fuente
Una clave foránea siempre requiere un índice. Sin un índice que imponga la restricción, se requeriría un escaneo completo de la tabla en la tabla referenciada para cada clave insertada o actualizada en la tabla de referencia. Y eso tendría un impacto inaceptable en el rendimiento. Esto tiene las siguientes 2 consecuencias:
fuente
Creo que esta es una manera fácil de eliminar el índice.
fuente
FOREIGN_KEY_CHEK=0
y al finalFOREIGN_KEY_CHEK=1
.En mi caso, eliminé la clave externa y aún no podía eliminar el índice. Eso fue porque había otra tabla que tenía una clave externa para esta tabla en los mismos campos. Después de que solté la clave foránea en la otra tabla, pude soltar los índices en esta tabla.
fuente
si desea soltar una columna de clave externa (que tiene una restricción), primero debe soltar la clave externa y luego soltar la columna, cuando suelte la clave externa, no tiene que pasar todo el nombre, simplemente pase la clave externa nombre de columna:
Más detalles sobre:
https://laravel.com/docs/6.x/migrations#foreign-key-constraints
fuente