Tengo dos tablas ya existentes que se ven (en parte) más o menos así:Cambio de clave principal de MySQL cuando existe contraints clave externa
CREATE TABLE parent (
old_pk CHAR(8) NOT NULL PRIMARY KEY
) ENGINE=InnoDB;
CREATE TABLE child (
parent_key CHAR(8),
FOREIGN KEY (parent_key) REFERENCES parent(old_pk)
ON UPDATE CASCADE ON DELETE CASCADE
) ENGINE=InnoDB;
Quiero añadir un nuevo número entero de incremento automático id
columna para parent
y utilizarlo como la clave principal en su lugar, si bien mantienen old_pk
como clave única y permitiendo que otras tablas como child
hacer referencia a ella en contraints clave externa. Por desgracia, simplemente diciendo ALTER TABLE parent DROP PRIMARY KEY
no funciona:
Código de error: 1025
error de cambiar el nombre de './data/#sql-4013_70f5e' a './data/parent' (Error: 150)
algunas google sugiere que esto se debe a la referencia de clave externa existente de child
. En esencia, necesito una forma de decirle a MySQL "use esta otra columna como clave principal, pero no olvide la clave única del original". ¿Hay alguna manera de lograr esto, que no sea simplemente eliminar las restricciones clave del child
y restablecerlas después?
Supongamos que debo modificar las tablas en su lugar, en lugar de crear copias con los mismos datos y cambiarlos más tarde. Intenté usar SET FOREIGN_KEY_CHECKS = 0
antes de modificar la tabla, pero parece que no me ayuda.
Es por eso que no hago clave primaria visible para el usuario (Estoy a favor de clave primaria sustituta de el primer momento), los requisitos cambiantes de los usuarios son un dolor de cabeza, pero es bueno saber que está haciendo uso de su base de datos sustituta clave principal http://en.wikipedia.org/wiki/Surrogate_key –