Renommer les colonnes à clé étrangère dans MySQL

nous essayons de renommer une colonne dans MySQL (5.1.31, InnoDB) qui est une clé étrangère à une autre table.

au début, nous avons essayé D'utiliser Django-Sud, mais nous nous sommes heurtés à un problème connu:

http://south.aeracode.org/ticket/243

OperationalError: (1025, "Erreur sur la renommer"./xxx/#sql-bf_4d' pour './ xxx/cave_event' (errno: 150)")

et

Erreur sur la renommer"./xxx/#sql-bf_4b' pour './ xxx / cave_event' (errno: 150)

cette erreur 150 se rapporte certainement à des contraintes de clé étrangère. Voir par exemple

Quelle est l'erreur mysql 1025 (HY000): Erreur sur renommer"./ foo' (errorno: 150) moyenne?

http://www.xaprb.com/blog/2006/08/22/mysqls-error-1025-explained /

donc, maintenant nous essayons de faire le renommage en SQL brut. Il semble que nous allons devoir laisser tomber la clé étrangère en premier, puis faire le renommage, et puis Ajouter la clé étrangère de nouveau. Est-ce que son droit? Est-il une meilleure façon de faire, puisque cela semble assez confus et fastidieux?

toute aide serait très appréciée!

41
demandé sur Community 2010-01-06 19:39:02

5 réponses

AFAIK, supprimer la contrainte, puis renommer, puis Ajouter la contrainte de retour est la seule façon. Sauvegarde d'abord!

45
répondu Dave Swersky 2010-01-06 16:41:34

dans le cas où quelqu'un est à la recherche de la syntaxe il va quelque chose comme ceci:

alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`; 

alter table customer_account  add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
24
répondu 34m0 2013-02-19 19:13:32

voici la syntaxe SQL pour les clés régulières

ALTER TABLE `thetable`
  DROP KEY `oldkey`, 
  ADD KEY `newkey` (`tablefield`);
3
répondu mcm 2012-12-08 23:30:51

en prolongeant la réponse de @Dewey, voici un petit script pour renommer FKS généré par Hibernate d'une manière utile ("FK__" + table name + "__" + referenced table name) .

SELECT CONCAT(
  "alter table ", TABLE_NAME, " drop foreign key ", CONSTRAINT_NAME,";\n",
  "alter table ", TABLE_NAME, " drop key ", CONSTRAINT_NAME, ";\n",
  "alter table ", TABLE_NAME, " add key FK__", table_name, "__",
      referenced_table_name, " (", column_name, ");\n",
  "alter table ", TABLE_NAME, " add constraint FK__", table_name, "__",
      referenced_table_name , " foreign key (", column_name, ") ",
      "references ", referenced_table_name,
      "(", referenced_column_name, ");"
  ) AS runMe 
FROM
  information_schema.key_column_usage
WHERE 
  TABLE_SCHEMA='myschemaname' 
  AND 
  constraint_name like 'FK_%';

un peu de sortie:

alter table visitor_browsers drop foreign key FK_4ygermmic4fujggq1kp96dx47;
alter table visitor_browsers drop key FK_4ygermmic4fujggq1kp96dx47;
alter table visitor_browsers add key FK__visitor_browsers__websites (website);
alter table visitor_browsers add constraint FK__visitor_browsers__websites foreign key (website) references websites(id);
0
répondu Jan Żankowski 2018-02-01 03:42:10

la requête suivante construira la syntaxe correcte automatiquement. Juste exécuter chaque ligne retournée et tous vos Clefs aura disparu.

je laisse le revers (en les rajoutant) comme un exercice pour vous.

SELECT CONCAT("alter table ", TABLE_NAME," drop foreign key `", CONSTRAINT_NAME,"`; ") AS runMe
FROM information_schema.key_column_usage 
WHERE TABLE_SCHEMA='MY_SCHEMA_NAME';
0
répondu Dewey 2018-02-01 03:42:41