Tengo dos tablas, table1
es la tabla primaria con una columna ID
y table2
con una columna IDFromTable1
(no el nombre real) cuando pongo un FK en IDFromTable1
que ID
en table1
que sale el error Foreign key constraint is incorrectly formed error
. Me gustaría eliminar el registro de la tabla 2 si el table1
registro se elimina. Gracias por cualquier ayuda
ALTER TABLE `table2`
ADD CONSTRAINT `FK1`
FOREIGN KEY (`IDFromTable1`) REFERENCES `table1` (`ID`)
ON UPDATE CASCADE
ON DELETE CASCADE;
Avíseme si necesita otra información. Soy nuevo en mysql
table2.IDFromTable1
ytable1.ID
?Respuestas:
Me encontré con este mismo problema con HeidiSQL. El error que recibe es muy críptico. Mi problema terminó siendo que la columna de clave externa y la columna de referencia no eran del mismo tipo o longitud.
La columna de clave externa era
SMALLINT(5) UNSIGNED
y la columna referenciada eraINT(10) UNSIGNED
. Una vez que los hice del mismo tipo exacto, la creación de clave externa funcionó perfectamente.fuente
Tuve el mismo problema cuando la tabla principal se creó usando el
MyISAM
motor. Es un error tonto, que solucioné con:fuente
asegúrese de que las columnas sean idénticas (del mismo tipo) y si la columna de referencia no lo es
primary_key
, asegúrese de que lo seaINDEXED
.fuente
KEY referencing_column(referencing_column)
ANTES de que ambas definiciones de clave externa se agregaran con éxito :)La sintaxis para definir claves foráneas es muy indulgente, pero para cualquiera que esté tropezando con esto, el hecho de que las claves foráneas deben ser "del mismo tipo" se aplica incluso a la clasificación, no solo al tipo de datos y la longitud y la firma de bits.
No es que mezclaría la intercalación en su modelo (¿verdad?), Pero si lo hace, asegúrese de que sus campos de clave primaria y externa sean del mismo tipo de intercalación en phpmyadmin o Heidi SQL o lo que sea que use.
Espero que esto le ahorre las cuatro horas de prueba y error que me costó.
fuente
COLLATE utf8mb4_unicode_ci
fue mi problema (inesperado) (en la máquina de desarrollo).Tuve el mismo problema, pero lo resolví.
¡Solo asegúrese de que la columna 'ID' en 'table1' tenga un índice ÚNICO !
Y, por supuesto, el tipo, la longitud de las columnas 'ID' e 'IDFromTable1' en estas dos tablas tiene que ser el mismo. Pero ya sabes sobre esto.
fuente
Solo para completar.
Este error también podría ser el caso si tiene una clave foránea con VARCHAR (..) y el juego de caracteres de la tabla referenciada es diferente de la tabla que hace referencia a ella.
por ejemplo, VARCHAR (50) en una tabla Latin1 es diferente de VARCHAR (50) en una tabla UTF8.
fuente
los textos de error de mysql no ayudan mucho, en mi caso, la columna tenía una restricción "no nula", por lo que no estaba permitido "on delete set null"
fuente
si todo está bien, solo agregue
->unsigned();
al final deforegin key
.Si no funciona, verifique el tipo de datos de ambos campos. deben ser lo mismo.
fuente
Tuve el mismo problema, ambas columnas eran INT (11) NO NULL pero no podía crear la clave foránea. Tuve que deshabilitar las comprobaciones de claves externas para ejecutarlo con éxito:
Espero que esto ayude a alguien.
fuente
Una causa más probable para la visualización de este error. El orden en el que estaba creando las tablas era incorrecto. Intenté hacer referencia a una clave de una tabla que aún no se había creado.
fuente
(Último reenvío) Incluso si el nombre del campo y el tipo de datos son los mismos pero la intercalación no es la misma, también dará lugar a ese problema.
Por ejemplo
Intenta cambiarlo a
....
Esto funcionó para mí.
fuente
Verifique el motor de tablas, ambas tablas tienen que ser el mismo motor, eso me ayudó mucho.
fuente
SHOW TABLE STATUS LIKE 'table_name';
Tenía los mismos problemas.
El problema es que la columna de referencia no es una clave principal.
Conviértalo en una clave principal y el problema está resuelto.
fuente
Aunque las otras respuestas son bastante útiles, solo quería compartir mi experiencia también.
Me enfrenté al problema cuando eliminé una tabla a la que
id
ya se hacía referencia como clave externa en otras tablas ( con datos ) e intenté recrear / importar la tabla con algunas columnas adicionales.La consulta de recreación (generada en phpMyAdmin) tenía el siguiente aspecto:
Como puede observar, el
PRIMARY KEY
índice se estableció después de la creación ( e inserción de datos ) que estaba causando el problema.Solución
La solución fue agregar el
PRIMARY KEY
índice en la consulta de definición de tabla para laid
que se hacía referencia como clave foránea, y también eliminarlo de laALTER TABLE
parte donde se establecían los índices:fuente
¡Perdí por horas por eso!
PK en una mesa estaba
utf8
en otra erautf8_unicode_ci
!fuente
Intenta ejecutar lo siguiente:
fuente
Tuve el mismo problema con Symfony 2.8.
Al principio no lo entendí, porque no había problemas similares con la longitud int de las claves externas, etc.
Finalmente tuve que hacer lo siguiente en la carpeta del proyecto. (¡Un reinicio del servidor no ayudó!)
app/console doctrine:cache:clear-metadata app/console doctrine:cache:clear-query app/console doctrine:cache:clear-result
fuente
gracias S Doerin:
"Solo para completar. Este error también podría ser el caso si tiene una clave externa con VARCHAR (..) y el conjunto de caracteres de la tabla referenciada es diferente de la tabla que hace referencia a ella. Por ejemplo, VARCHAR (50) en una tabla Latin1 es diferente al VARCHAR (50) en una tabla UTF8 ".
Resolví este problema, cambiando el tipo de caracteres de la tabla. la creación tiene latin1 y la correcta es utf8.
agregue la siguiente línea. CONJUNTO DE CARACTERES POR DEFECTO = utf8;
fuente
Tuve problemas al usar Alter table para agregar una clave externa entre dos tablas y lo que me ayudó fue asegurarme de que cada columna a la que intentaba agregar una relación de clave externa estuviera indexada. Para hacer esto en PHP myAdmin: Vaya a la tabla y haga clic en la pestaña de estructura. Haga clic en la opción de índice para indexar la columna deseada como se muestra en la captura de pantalla:
Una vez que indicé ambas columnas que estaba tratando de hacer referencia con mis claves foráneas, pude usar con éxito la tabla alter y crear la relación de clave foránea. Verá que las columnas están indexadas como en la siguiente captura de pantalla:
observe cómo se muestra zip_code en ambas tablas.
fuente
Debe verificar que ambos sean iguales en todas sus propiedades, incluido en "Colación"
fuente
Yo estaba usando HeidiSQL y para resolver este problema tuve que crear un índice en la tabla referenciada con todas las columnas referenciadas.
fuente
Me encontré con el mismo problema en este momento. En mi caso, todo lo que tuve que hacer es asegurarme de que la tabla a la que me refiero en la clave externa se debe crear antes de la tabla actual (anteriormente en el código). Entonces, si hace referencia a una variable (x * 5), el sistema debe saber qué es x (x debe declararse en líneas de código anteriores). Esto resolvió mi problema, espero que ayude a alguien más.
fuente
Tuve el mismo problema con el generador de esquemas de migración Laravel 5.1 con MariaDB 10.1.
El problema era que había escrito en
unigned
lugar deunsigned
(els
faltaba letra) al configurar la columna.Después de corregir el error tipográfico se solucionó para mí.
fuente
Incluso me encontré con el mismo problema con mysql y liquibase. Entonces, este es el problema: la tabla desde la que desea hacer referencia a una columna de otra tabla es diferente, ya sea en el caso del tipo de datos o en términos de tamaño del tipo de datos.
fuente
Verifique que haya especificado el nombre de la tabla en el caso apropiado (si los nombres de la tabla distinguen entre mayúsculas y minúsculas en su base de datos). En mi caso tuve que cambiar
a
tenga en cuenta el
customer
cambiado aCUSTOMER
.fuente
O puede usar DBDesigner4 que tiene una interfaz gráfica para crear su base de datos y vincularlos usando FK. Haga clic derecho en su tabla y seleccione 'Copiar tabla Crear SQL' que crea el código.
fuente
Es un tema antiguo pero descubrí algo. Al construir un banco de trabajo MySQL, también obtiene las relaciones de la otra tabla. solo deja los pilares con los que te relacionas. Borrar otras columnas agregadas automáticamente. Esto funciona para mi.
fuente
Mi caso fue que tenía un error tipográfico en la columna referida:
El mensaje de error es bastante críptico y he intentado todo: verificar los tipos de columnas, colaciones, motores, etc.
Me tomó un tiempo notar el error tipográfico y después de arreglarlo todo funcionó bien:
fuente
Me enfrento a este problema, el error vino cuando pones la clave primaria en diferentes tipos de datos como:
tabla 1:
Tabla 2:
el tipo de datos para la identificación de la segunda tabla debe ser incrementos
fuente
El problema es muy simple de resolver.
por ejemplo: tiene dos tablas con nombres de usuarios y publicaciones y desea crear una clave externa en la tabla de publicaciones y usa phpMyAdmin
1) en la tabla de publicación agregue una nueva columna ( nombre : use_id | tipo : como el id en la tabla de usuario | Longitud : como el id en la tabla de usuario | Predeterminado : NULL | Atributos : sin firmar | índice: ÍNDICE)
2) en la pestaña Estructura, vaya a la vista de relación ( Nombre de restricción : configuración automática por phpmyAdmin | nombre de columna : seleccione id_usuario | tabla : usuarios | clave : id, ...)
Simplemente fue resuelto
fuente