Estoy tratando de importar un archivo .sql y no puedo crear tablas.
Aquí está la consulta que falla:
CREATE TABLE `data` (
`id` int(10) unsigned NOT NULL,
`name` varchar(100) NOT NULL,
`value` varchar(15) NOT NULL,
UNIQUE KEY `id` (`id`,`name`),
CONSTRAINT `data_ibfk_1` FOREIGN KEY (`id`) REFERENCES `keywords` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
Exporté el .sql de la misma base de datos, descarté todas las tablas y ahora estoy tratando de importarlo, ¿por qué falla?
MySQL: no se puede crear la tabla './dbname/data.frm' (errno: 150)
mysql
sql
phpmyadmin
mysql-error-150
gtilx
fuente
fuente
Respuestas:
De MySQL - Documentación de restricciones de CLAVE EXTRANJERA :
fuente
Whether its possible to write Nested Query for my problem
? .. ¡Te pediría que me contestaras también!El error 150 significa que tiene un problema con su clave externa. ¿Posiblemente la clave en la tabla extranjera no es exactamente el mismo tipo?
fuente
BIGINT
vsINT
cuando uso generadores de esquemas.Puede obtener el mensaje de error real ejecutando
SHOW ENGINE INNODB STATUS;
y luego buscandoLATEST FOREIGN KEY ERROR
en la salida.Fuente: respuesta de otro usuario en una pregunta similar
fuente
Los tipos de datos deben coincidir exactamente. Si se trata de tipos varchar, las tablas deben usar la misma clasificación.
fuente
Creo que todas estas respuestas, aunque correctas, son engañosas a la pregunta.
La respuesta real es esta antes de comenzar una restauración, si está restaurando un archivo de volcado con claves foráneas:
porque, naturalmente, la restauración creará algunas restricciones antes de que la tabla foránea exista.
fuente
En algunos casos, puede encontrar este mensaje de error si hay diferentes motores entre las tablas relacionadas. Por ejemplo, una tabla puede estar usando InnoDB mientras que la otra usa MyISAM. Ambos necesitan ser iguales
fuente
Error no 150 significa una falla de restricción de clave externa. Probablemente esté creando esta tabla antes de la tabla de la que depende la clave externa (tabla
keywords
). Cree esa tabla primero y debería funcionar bien.Si no es así, elimine la declaración de clave externa y agréguela después de crear la tabla; obtendrá un mensaje de error más significativo sobre el error de restricción específica.
fuente
Hay bastantes cosas que pueden causar errno 150, por lo que para las personas que buscan este tema, esto es lo que creo que es una lista cercana a exhaustiva ( Causas de origen de Errno 150 ):
Para errno 150 o errno 121, simplemente escribiendo SHOW ENGINE INNODB STATUS, hay una sección llamada "ÚLTIMO ERROR DE CLAVE EXTRANJERA". Debajo de eso, le dará un mensaje de error muy útil, que generalmente le dirá de inmediato cuál es el problema. Necesitas privilegios SUPER para ejecutarlo, así que si no tienes eso, solo tendrás que probar los siguientes escenarios.
1) Los tipos de datos no coinciden: los tipos de las columnas deben ser los mismos
2) Columnas principales no indexadas (o indexadas en orden incorrecto)
3) Las colaciones de columnas no coinciden
4) Usar SET NULL en una columna NOT NULL
5) Las intercalaciones de tablas no coinciden: incluso si las intercalaciones de columnas coinciden, en algunas versiones de MySQL esto puede ser un problema.
6) La columna principal no existe realmente en la tabla principal. Revise la ortografía (y quizás un espacio al principio o al final de la columna)
7) Uno de los índices en una de las columnas está incompleto, o la columna es demasiado larga para un índice completo. Tenga en cuenta que MySQL (a menos que lo ajuste) tiene una longitud máxima de clave de una sola columna de 767 bytes (esto corresponde a una columna UTF varchar (255))
En caso de que obtenga un errno 121, aquí hay un par de causas:
1) El nombre de restricción que eligió ya está tomado
2) En algunos sistemas si hay una diferencia de caso en su declaración y nombres de tabla. Esto puede morderte si vas de un servidor a otro que tiene diferentes reglas de manejo de casos.
fuente
A veces MySQL es súper estúpido: puedo entender la causa de las claves foráneas ... pero en mi caso, acabo de descartar toda la base de datos y sigo recibiendo el error ... ¿por qué? Quiero decir, ya no hay una base de datos ... y el usuario sql que estoy usando no tiene acceso a ninguna otra base de datos en el servidor ... quiero decir, el servidor está "vacío" para el usuario actual y todavía obtengo ¿este error? Lo siento, pero supongo que MySQL me está mintiendo ... pero puedo lidiar con eso :) Simplemente agregue estas dos líneas de SQL alrededor de su declaración fucky:
Ahora se debe ejecutar el sql ... Si realmente tiene un problema de clave externa, aparecerá en la línea donde habilitará las comprobaciones nuevamente; esto fallará entonces ... pero mi servidor está en silencio :)
fuente
Después de navegar por las respuestas anteriores y experimentar un poco, esta es una forma efectiva de resolver errores de clave externa en MySQL (1005 - error 150).
Para que la clave externa se cree correctamente, todo lo que MySQL pide es:
Satisfaga estos requisitos y todo estará bien.
fuente
Experimenté este error cuando porté la aplicación de Windows a Linux. En Windows, los nombres de las tablas de la base de datos no distinguen entre mayúsculas y minúsculas, y en Linux distinguen entre mayúsculas y minúsculas, probablemente debido a la diferencia del sistema de archivos. Entonces, en la tabla de Windows
Table1
es lo mismo quetable1
, y enREFERENCES
ambostable1
yTable1
funciona. En Linux, cuando la aplicación se usaba entable1
lugar deTable1
cuando creaba la estructura de la base de datos, vi el error # 150; cuando hice el caso correcto de los caracteres en lasTable1
referencias, también comenzó a funcionar en Linux. Por lo tanto, si nada más ayuda, asegúrese deREFERENCES
usar el caso de caracteres correcto en el nombre de la tabla cuando esté en Linux.fuente
Cambie los motores de sus tablas, solo innoDB admite claves foráneas
fuente
Si la tabla PK se crea en un CHARSET y luego crea la tabla FK en otro CHARSET ... entonces también podría obtener este error ... También obtuve este error, pero después de cambiar el juego de caracteres a PK charset, se ejecutó sin errores
fuente
Este error puede ocurrir si dos tablas tienen una referencia, por ejemplo, una tabla es Estudiante y otra tabla es Educación, y queremos que la tabla Educación tenga una referencia de clave externa de la tabla Estudiante. En este caso, el tipo de datos de columna para ambas tablas debe ser el mismo, de lo contrario generará un error.
fuente
En la mayoría de los casos, el problema se debe a la diferencia ENGINE. Si InnoDB crea el padre, entonces MyISAM crea las tablas a las que se hace referencia y viceversa.
fuente
En mi caso. Tuve problemas con el motor y el juego de caracteres porque mi servidor Hosting cambió la configuración y mis nuevas tablas eran MyISAM, pero mis tablas anteriores son InnoDB. Solo he cambiado.
fuente
La clave externa debe tener el mismo tipo de datos que la clave primaria . Además, si la clave primaria no está firmada , la clave externa también debe estar sin firmar .
fuente
Tuve el mismo problema Estaba relacionado con la columna Collation de la tabla y el conjunto de caracteres . Asegúrese de que el conjunto de caracteres y la clasificación deben ser iguales para ambas columnas en dos tablas. Si desea establecer una clave externa en eso. Ejemplo- Si pones clave externa en la columna ID de usuario de la tabla userimage referencia a la columna ID de usuario de los usuarios table.Then colación debe ser el mismo que es utf8_general_ci y juego de caracteres UTF-8 para ambas columnas de tablas. Generalmente, cuando crea una tabla, mysql toma estas dos configuraciones de la configuración del servidor.
fuente
Asegúrese de que tanto su columna de clave principal como la columna a la que se hace referencia tengan los mismos tipos de datos y atributos (sin signo, binario, sin signo, zerofill, etc.).
fuente
Un caso real es cuando ha utilizado una herramienta MySQL (Sequel Pro en mi caso) para cambiar el nombre de una base de datos. Luego creó una base de datos con el mismo nombre.
Esto mantuvo las restricciones de clave externa para el mismo nombre de base de datos, por lo que la base de datos renombrada (por ejemplo, my_db_renamed) tenía restricciones de clave externa en la base de datos recién creada (my_db)
No estoy seguro de si esto es un error en Sequel Pro, o si algún caso de uso requiere este comportamiento, pero me costó la mayor parte de una mañana: /
fuente
Yo tenía el mismo error. En mi caso, la razón del error fue que tenía una instrucción ON DELETE SET NULL en la restricción, mientras que el campo en el que puse la restricción en su definición tenía una instrucción NOT NULL. Permitir NULL en el campo resolvió el problema.
fuente
Enfrenté este tipo de problema al crear DB desde el archivo de texto.
Acabo de escribir las líneas anteriores en
Create.bat
y ejecuto el archivo bat.Mi error está en el orden de ejecución de la secuencia en mis archivos sql. Traté de crear una tabla con clave primaria y también clave externa. Mientras se ejecuta, buscará la tabla de referencia, pero las tablas no están allí. Entonces devolverá ese tipo de error.
fuente
Tuve un problema similar, pero el mío fue porque estaba agregando un nuevo campo a una tabla existente que tenía datos, y el nuevo campo hacía referencia a otro campo de la tabla principal y también tenía la Definición de NOT NULL y sin ningún VALOR POR DEFECTO. - Descubrí que la razón por la que las cosas no funcionaban era porque
Es importante recordar que, en circunstancias normales, si planificó su base de datos con suficiente anticipación e implementó restricciones antes de la inserción de datos, se evitaría este escenario en particular
El enfoque más fácil para evitar este problema es
Espero que esto ayude a alguien
fuente
Quizás esto ayude? La definición de la columna de clave principal debe ser exactamente la misma que la columna de clave externa.
fuente
Asegúrese de que todas las tablas pueden admitir claves foráneas - motor InnoDB
fuente
La columna de la tabla PADRE a la que se refiere desde la tabla secundaria tiene que ser única. Si no es así, causa un error no 150.
fuente
Tuve un problema similar al volcar una base de datos mysql de Django con una sola tabla. Pude solucionar el problema volcando la base de datos a un archivo de texto, moviendo la tabla en cuestión al final del archivo usando emacs e importando el archivo de volcado sql modificado a la nueva instancia.
HTH Uwe
fuente
He corregido el problema haciendo que la variable acepte
null
fuente
Tuve el mismo problema al ejecutar una serie de comandos MySQL. La mía ocurre durante la creación de una tabla cuando se hace referencia a una clave externa a otra tabla que aún no se creó. Es la secuencia de la existencia de la tabla antes de hacer referencia.
La solución: cree las tablas primarias antes de crear una tabla secundaria que tenga una clave externa.
fuente
Cree la tabla sin clave externa, luego configure la clave externa por separado.
fuente