una primaria para llave foranea escribe eliminar definir crear compuesta como codigo clave añadir sql mysql foreign-keys mysql-error-1025

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

¿Qué significa el error 1025 de mysql (HY000): error al cambiar el nombre de ''./foo'' (errorno: 150)?

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'';