primaria - definir llave foranea en mysql
Renombrando columnas de clave foránea en MySQL (6)
Estamos intentando cambiar el nombre de una columna en MySQL (5.1.31, InnoDB) que es una clave externa para otra tabla.
Al principio, intentamos utilizar Django-South, pero tuvimos un problema conocido:
http://south.aeracode.org/ticket/243
Error operacional: (1025, "Error al cambiar el nombre de ''./xxx/#sql-bf_4d'' a ''./xxx/cave_event'' (errno: 150)")
Y
Error al cambiar el nombre de ''./xxx/#sql-bf_4b'' a ''./xxx/cave_event'' (errno: 150)
Este error 150 definitivamente pertenece a restricciones de clave externa. Ver por ejemplo
http://www.xaprb.com/blog/2006/08/22/mysqls-error-1025-explained/
Entonces, ahora estamos tratando de cambiar el nombre en SQL sin formato. Parece que vamos a tener que soltar primero la clave externa, luego hacer el cambio de nombre y luego volver a agregar la clave externa. ¿Eso suena bien? ¿Hay una mejor manera, ya que esto parece bastante confuso y engorroso?
Cualquier ayuda sería muy apreciada!
AFAIK, eliminando la restricción, luego renombrando, luego agregando la restricción es la única manera. Copia de seguridad primero!
Ampliando la respuesta de @ Dewey, aquí hay un pequeño script para cambiar el nombre de los FK generados por Hibernate de una manera útil ("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 poco de salida:
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);
Aquí está la sintaxis SQL para las claves regulares
ALTER TABLE `thetable`
DROP KEY `oldkey`,
ADD KEY `newkey` (`tablefield`);
En caso de que alguien esté buscando la sintaxis va algo como esto:
alter table customer_account drop foreign key `FK3FEDF2CC1CD51BAF`;
alter table customer_account add constraint `FK3FEDF2CCD115CB1A` foreign key (campaign_id) REFERENCES campaign(id);
Esta tarea se vuelve más sencilla si utiliza herramientas de GUI. ¡Intenté cambiar el nombre de la columna de ID con la herramienta de base de datos IntelliJ IDEA y funcionó a la perfección! No tengo que preocuparme por las claves externas al cambiar el nombre de una tabla o columna.
Ver más detalles en IntelliJ IDEA Ayuda | Renombrando artículos .
La siguiente consulta construirá la sintaxis correcta automáticamente. Simplemente ejecute cada línea devuelta y todos sus FKEY desaparecerán.
Dejo lo contrario (agregándolos de nuevo) como ejercicio para ti.
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'';