mysql - tipos - no se puede agregar o actualizar una fila secundaria falla una restricción de clave externa
Al agregar una clave externa a la tabla existente, la tabla de error 1050 ya existe (9)
Tengo una tabla CustomizationSet con las columnas:
customization_set_guid (which is a non-nullable guid and also the primary key)
creator_account_guid
and a few others
Y una tabla con registro de datos existentes con las columnas:
registration_id (an int and the primary key)
customization_set_guid (also a guid (so a char(36)) which is nullable, and all entries are currently null)
and a few other columns
Cuando intento correr
ALTER TABLE Registration ADD FOREIGN KEY
(
customization_set_guid
) REFERENCES CustomizationSet (
customization_set_guid
);
en MySQL Workbench, da el error 1050Table ''. / dbname / registration'' ya existe.
Si trato de usar la interfaz de usuario para agregar las claves foráneas con la pestaña Claves foráneas del cuadro de diálogo Modificar tabla, y elijo el conjunto de personalización como la tabla a la que se hace referencia, no me permite elegir personalización_set_guid en la lista de columnas.
Realmente no estoy seguro de por qué no me permite agregar esta clave externa. Acabo de crear con éxito las claves externas entre las tablas que acabo de agregar. La tabla de registro ha existido por un tiempo ...
- Compruebe el tipo de motor de almacenamiento para la tabla CustomizationSet.
Tuve un mismo problema pero podría resolverlo cambiando el tipo de motor a InnoDB, porque pocos tipos no admiten restricciones de clave externa.
Así que un miembro del equipo descubrió esto. La una tabla se configuró con el tipo utf8_general, y la otra se configuró al tipo predeterminado. No pensé que esto fuera un problema, ya que el valor predeterminado es utf8_general, pero aparentemente mysql solo mira los nombres de tipo y no el tipo subyacente.
Cuando se utiliza MysqlWorkbench, el error es engañoso. Mi problema fue que intentaba agregar una restricción de clave externa en la tabla que ya tenía filas y una de las filas estaba vacía (no cumplía con la restricción FK. En lugar de quejarse de que la restricción fallaría si se aplicaba, MysqlWorkbench informó que existe la tabla.
Eliminar la fila ofensiva fija (o agregar y restringir un valor aceptable al campo) resolvió el problema.
No estoy seguro de que la tabla ya exista, pero la razón por la que no le permite elegir la columna que desea es probablemente debido a que las columnas no son del mismo tipo. Asegúrese de que sean del mismo tipo, de la misma longitud y que tengan todas las mismas opciones.
No estoy seguro si es un error tipográfico pero no debería ser
ALTER TABLE Registration ADD FOREIGN KEY
(
customization_set_guid
) REFERENCES CustomizationSet (
customization_set_guid
);
ser algo como
ALTER TABLE Registration ADD FOREIGN KEY
customization_set_guid_fk (customization_set_guid)
REFERENCES CustomizationSet (customization_set_guid);
Parece que hay un informe de error para esto en MySQL ubicado aquí:
Al final, supongo que actualizaron su servidor y solucionó el problema. Por haberlo leído, no estoy seguro. Tenían algunas soluciones alternativas como poner nombres de restricciones / cambiarlos. Si crees que esto es lo mismo, solicitaría que se vuelva a abrir el error.
En un momento, mencionaron que los tipos no coincidían y la mesa de trabajo estaba respondiendo con un error incorrecto (debería haber sido un errno 150 o errno 121). Puede ver las causas de esos errores aquí: Errores de clave foránea de MySQL y Errno 150
Recibí el mismo error, y como mi caso aún no se mencionó, publicaré esta respuesta y, con suerte, ¡podría ahorrarle tiempo a alguien!
Mis dos mesas de motores, donde eran diferentes. El uno era InnoDB, y el otro MyIsam.
Para cambiar el motor de una mesa:
seleccione tabla, presione alterar tabla, y luego presione esa flecha doble en el extremo derecho de Workbench (para que apunte hacia arriba).
¡Ahora cambia el motor!
Recibí el mismo error, y se debió al hecho de que la clave externa ya existía. Lo que quieres es simplemente agregar la restricción:
ALTER TABLE Registration
ADD CONSTRAINT idx_Registration_CustomizationSet
FOREIGN KEY (customization_set_guid)
REFERENCES CustomizationSet(customization_set_guid);
Tuve un problema similar y al final fue un problema de restricción de integridad . La columna de clave externa hacía referencia a una columna externa que no existía.
Intenta ejecutar lo siguiente para probar si este es el caso:
select r.customization_set_guid, c.customization_set_guid
from Registration r
right join CustomizationSet c
on
r.customization_set_guid = c.customization_set_guid
where isnull(c.customization_set_guid);