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!
5 réponses
AFAIK, supprimer la contrainte, puis renommer, puis Ajouter la contrainte de retour est la seule façon. Sauvegarde d'abord!
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);
voici la syntaxe SQL pour les clés régulières
ALTER TABLE `thetable`
DROP KEY `oldkey`,
ADD KEY `newkey` (`tablefield`);
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);
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';