MySQL No se puede eliminar el índice necesario en una restricción de clave externa

Necesito ALTERAR mi base de datos existente para agregar una columna. En consecuencia, también quiero actualizar el campo UNIQUE para abarcar esa nueva columna. Estoy tratando de eliminar el índice actual pero sigo obteniendo el error MySQL 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 

Tienes que soltar la clave externa. Las claves externas en MySQL crean automáticamente un índice en la tabla (Hubo una pregunta SO sobre el tema).

 ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_1 ; 

Paso 1

Lista de clave externa (TEN EN CUENTA que es diferente del nombre de índice)

 SHOW CREATE TABLE 

El resultado le mostrará el nombre de la clave externa.

Paso 2

Tecla Drop (Extranjera / primaria / clave)

 ALTER TABLE  DROP FOREIGN KEY 

Paso 3

Suelta el índice.

Si quieres decir que puedes hacer esto:

 CREATE TABLE mytable_d ( ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY, Name VARCHAR(255) NOT NULL, UNIQUE(Name) ) ENGINE=InnoDB; ALTER TABLE mytable ADD COLUMN DID tinyint(5) NOT NULL, ADD CONSTRAINT mytable_ibfk_4 FOREIGN KEY (DID) REFERENCES mytable_d (ID) ON DELETE CASCADE; > OK. 

Pero entonces:

 ALTER TABLE mytable DROP KEY AID ; 

da error


Puede soltar el índice y crear uno nuevo en una instrucción ALTER TABLE :

 ALTER TABLE mytable DROP KEY AID , ADD UNIQUE KEY AID (AID, BID, CID, DID); 

Como debe tener un índice en un campo de clave externa, puede crear un índice simple en el campo ‘AID’

 CREATE INDEX aid_index ON mytable (AID); 

y solo entonces suelte el índice único ‘AID’

 ALTER TABLE mytable DROP INDEX AID; 

Creo que esta es una manera fácil de soltar el índice.

 set FOREIGN_KEY_CHECKS=1; ALTER TABLE mytable DROP INDEX AID; set FOREIGN_KEY_CHECKS=0;