226 votes

MySQL ne peut pas supprimer l'index nécessaire dans une contrainte de clé étrangère

J'ai besoin de MODIFIER ma base de données existante pour ajouter une colonne. Par conséquent, je souhaite également mettre à jour le champ UNIQUE pour englober cette nouvelle colonne. J'essaie de supprimer l'index actuel mais je continue à obtenir l'erreur 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

319voto

Brian Fisher Points 10755

Vous devez supprimer la clé étrangère. Les clés étrangères dans MySQL créent automatiquement un index sur la table (il y avait une question SO sur le sujet).

 ALTER TABLE mytable DROP FOREIGN KEY mytable_ibfk_1 ; 

108voto

Abhishek Goel Points 792

Étape 1

Liste des clés étrangères (NOTE que c'est différent du nom de l'index)

 SHOW CREATE TABLE  <Table Name>

Le résultat vous montrera le nom de la clé étrangère.

Format:

 CONSTRAINT `FOREIGN_KEY_NAME` FOREIGN KEY (`FOREIGN_KEY_COLUMN`) REFERENCES `FOREIGN_KEY_TABLE` (`id`),

Étape 2

Drop (étrangère/primaire/clé) Clé

 ALTER TABLE <Table Name> DROP FOREIGN KEY <Foreign key name>

Étape 3

Supprimez l'index.

19voto

ypercube Points 62714

Si tu veux dire que tu peux faire ça :

 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.

Mais alors:

 ALTER TABLE mytable
DROP KEY AID ;

donne une erreur.


Vous pouvez supprimer l'index et en créer un nouveau dans une instruction ALTER TABLE

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

10voto

Eli DM Points 376

Parce que vous devez avoir un index sur un champ de clé étrangère, vous pouvez simplement créer un index simple sur le champ 'AID'

 CREATE INDEX aid_index ON mytable (AID);

et alors seulement déposer l'index unique 'AID'

 ALTER TABLE mytable DROP INDEX AID;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X