Ancienne question mais ajout de réponse pour qu'on puisse obtenir de l'aide
Son processus en deux étapes:
Supposons que table1
a ait une clé étrangère avec un nom de colonne fk_table2_id
, avec un nom de contraintefk_name
et table2
soit référencé table avec clé t2
( quelque chose comme ci-dessous dans mon diagramme ).
table1 [ fk_table2_id ] --> table2 [t2]
Première étape , DROP old CONSTRAINT: ( référence )
ALTER TABLE `table1`
DROP FOREIGN KEY `fk_name`;
la contrainte de notification est supprimée, la colonne n'est pas supprimée
Deuxième étape , AJOUTER une nouvelle CONTRAINTE:
ALTER TABLE `table1`
ADD CONSTRAINT `fk_name`
FOREIGN KEY (`fk_table2_id`) REFERENCES `table2` (`t2`) ON DELETE CASCADE;
ajout de contrainte, la colonne est déjà là
Exemple:
J'ai un UserDetails
tableau fait référence à un 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`)
:
:
Premier pas:
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:
Ceci est utile pour minimiser les temps d'arrêt si vous avez une grande table.
la source
la source
ALTER TABLE table_name ADD
...ON DELETE RESTRICT
SHOW CREATE TABLE
.N'oubliez pas que MySQL conserve un index simple sur une colonne après la suppression de la clé étrangère. Donc, si vous devez changer la colonne 'références', vous devez le faire en 3 étapes
drop index
clause using )la source
Vous pouvez simplement utiliser une seule requête pour les régler toutes:
ALTER TABLE products DROP FOREIGN KEY oldConstraintName, ADD FOREIGN KEY (product_id, category_id) REFERENCES externalTableName (foreign_key_name, another_one_makes_composite_key) ON DELETE CASCADE ON UPDATE CASCADE
la source
J'avais un tas de FK à modifier, alors j'ai écrit quelque chose pour faire les déclarations à ma place. Je pensais que je partagerais:
la source