Lorsque la table a été configurée avec une colonne contenant une clé étrangère et configurée en cascade (delete enfant lorsque le parent est supprimé), quelle serait la commande sql pour modifier cette restriction en restriction? (impossible de supprimer le parent s'il a des enfants)
Réponses
Trop de publicités?Vieille question, mais l'ajout de répondre de sorte que l'on peut obtenir de l'aide
Ses processus en deux étapes:
Supposons, d'un table1
a une clé étrangère avec le nom de la colonne fk_table2_id
, avec la contrainte de nom fk_name
et table2
est visée table avec clé t2
(quelque chose comme ci-dessous dans mon schéma).
table1 [ fk_table2_id ] --> table2 [t2]
Première étape, de CHUTE vieux CONTRAINTE: (référence)
ALTER TABLE `table1`
DROP FOREIGN KEY `fk_name`;
avis contrainte est supprimée, la colonne n'est pas supprimé
Deuxième étape, AJOUTER de nouvelles CONTRAINTES:
ALTER TABLE `table1`
ADD CONSTRAINT `fk_name`
FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE;
l'ajout de la contrainte, de la colonne est déjà là
Exemple:
J'ai un UserDetails
tableau se réfère à l' Users
tableau:
mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Detail_id`),
KEY `FK_User_id` (`User_id`),
CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`)
:
:
Première étape:
mysql> ALTER TABLE `UserDetails` DROP FOREIGN KEY `FK_User_id`;
Query OK, 1 row affected (0.07 sec)
Deuxième étape:
mysql> ALTER TABLE `UserDetails` ADD CONSTRAINT `FK_User_id`
-> FOREIGN KEY (`User_id`) REFERENCES `Users` (`User_id`) ON DELETE CASCADE;
Query OK, 1 row affected (0.02 sec)
résultat:
mysql> SHOW CREATE TABLE UserDetails;
:
:
`User_id` int(11) DEFAULT NULL,
PRIMARY KEY (`Detail_id`),
KEY `FK_User_id` (`User_id`),
CONSTRAINT `FK_User_id` FOREIGN KEY (`User_id`) REFERENCES
`Users` (`User_id`) ON DELETE CASCADE
:
Vous pouvez le faire en une seule requête si vous souhaitez modifier son nom:
ALTER TABLE table_name
DROP FOREIGN KEY `fk_name`,
ADD CONSTRAINT `fk_name2` FOREIGN KEY (`remote_id`)
REFERENCES `other_table` (`id`)
ON DELETE CASCADE;
Ceci est utile pour minimiser les temps d'arrêt si vous avez une grande table.