123 votes

Comment changer l'action référentielle de clé étrangère? (comportement)

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)

198voto

Grijesh Chauhan Points 28442

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
:

25voto

Romuald Brunet Points 1062

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.

13voto

pascal Points 1823
ALTER TABLE DROP FOREIGN KEY fk_name;
ALTER TABLE ADD FOREIGN KEY fk_name(fk_cols)
            REFERENCES tbl_name(pk_names) ON CASCADE RESTRICT;

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