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 continue à recevoir l'erreurMySQL 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
sur ma table?Réponses:
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).
la source
mytable
ADD CONSTRAINTmytable_ibfk_1
FOREIGN KEY (AID
) REFERENCESmytable_a
(ID
) ON DELETE CASCADE;FOREIGN KEY
contrainte était anonyme?Étape 1
Liste des clés étrangères (notez qu'elle est différente du nom d'index)
Le résultat vous montrera le nom de la clé étrangère.
Format:
Étape 2
Clé de suppression (étrangère / primaire / clé)
Étape 3
Supprimez l'index.
la source
Si vous voulez dire que vous pouvez faire ceci:
Mais alors:
donne une erreur.
Vous pouvez supprimer l'index et en créer un nouveau en une seule
ALTER TABLE
instruction:la source
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'
et alors seulement, supprimez l'index unique 'AID'
la source
Une clé étrangère nécessite toujours un index. Sans un index, l'application de la contrainte nécessiterait une analyse complète de la table sur la table référencée pour chaque clé insérée ou mise à jour dans la table de référence. Et cela aurait un impact inacceptable sur les performances. Cela a les 2 conséquences suivantes:
la source
Je pense que c'est un moyen facile de supprimer l'index.
la source
FOREIGN_KEY_CHEK=0
et à la finFOREIGN_KEY_CHEK=1
.Dans mon cas, j'ai laissé tomber la clé étrangère et je ne pouvais toujours pas supprimer l'index. C'était parce qu'il y avait encore une autre table qui avait une clé étrangère à cette table sur les mêmes champs. Après avoir déposé la clé étrangère sur l'autre table, j'ai pu supprimer les index sur cette table.
la source
si vous voulez supprimer une colonne de clé étrangère (avec une contrainte), vous devez d'abord supprimer la clé étrangère, puis déposer la colonne, lorsque vous déposez la clé étrangère, vous n'avez pas à passer tout le nom, passez simplement la clé étrangère nom de colonne:
plus de détails sur:
https://laravel.com/docs/6.x/migrations#foreign-key-constraints
la source