web-dev-qa-db-fra.com

Comment renommer une clé étrangère dans mysql?

Nous venons de terminer une longue migration sur une grande table et avons abouti à la contrainte suivante sur notre table conversation_tags:

CONSTRAINT `conversation_tags_ibfk_1` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`)

Malheureusement, il y avait un bug quelque part, car ce que nous voulions, c'était:

CONSTRAINT `fk_conversation_tags_tags` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`)

Si vous supprimez et rajoutez la contrainte, cela signifierait deux autres longues requêtes. Est-il possible de renommer la contrainte en une seule requête?

26
Simon

De la documentation :

Plusieurs clausesADD,ALTER,DROPetCHANGEsont autorisées dans un single ALTER TABLE statement, séparés par des virgules. Ceci est une extension MySQL Au SQL standard, qui n'autorise qu'une de chaque clause par instruction ALTER TABLE.

De cette façon, vous pouvez combiner la suppression et la recréation dans une requête, ce qui devrait être plus rapide que de supprimer la contrainte et de la créer dans deux requêtes:

ALTER TABLE conversation_tags
DROP FOREIGN KEY `conversation_tags_ibfk_1`,
ADD CONSTRAINT `fk_conversation_tags_tags` FOREIGN KEY (`tag_id`) REFERENCES `tags` (`id`);
55
bradoaks

Je suis désolé, mais les contraintes ne peuvent être supprimées et réattribuées que dans MySQL

6
VAShhh

La fonctionnalité ne semble pas être disponible dans la syntaxe mysql ALTER TABLE.

Cependant, il est pris en charge pour Oracle.

1
VGE

Veuillez vous référer à ma réponse dans La terminologie MySQL "contraintes" vs différence de "clés étrangères"? pour comprendre pourquoi le nom de la contrainte était différent de ce que vous désiriez. Cependant, MySQL ne dispose pas de la fonction de contrainte de changement de nom et nécessite donc DROP et ADD FK avec le nom souhaité. https://dev.mysql.com/doc/refman/5.5/fr/alter-table.html

0
RxBx