Solo hay dos posibles casos en los que nos podría fallar, con este error, nuestra creación de claves foráneas en una base de datos MySQL.
- Si los dos campos (Nombre de campo y el nombre de campo foráneo) usan tipos de campo incompatibles.
- Si tu usas “On Delete Set Null” pero el campo no lo permite, MySQL te devolverá el error.
Me decidi a crear este post, porque tuve el problemilla, hay mucha gente por muchos foros buscando resolverlo y no está detallada la información :D. Es una tontería que me hizo perder tiempo, espero que no se lo haga perder a otros.
39 comentarios
Es cierto, era eso, me salió el error y era por campos foránetos con tipos de datos incompatibles, gracias!
Bueno… mis columnas comparten el tipo de dato que es de tipo INT con longitud (4) NOT NULL DEFAULT 0…
No se que hacer. El statement que uso para añadir la llave foranea es:
ALTER TABLE cti ADD FOREIGN KEY (entidad_id) REFERENCES entidades (entidad_id) ON DELETE RESTRICT ON UPDATE CASCADE;
El error es:
#1005 – Can’t create table ‘.\digitalizacion\#sql-7a0_da.frm’ (errno: 150)
Por si hay alguna duda va la estructura de la tabla:
Tabla cti
| Field | Type | Null | Key | Default | Extra |
| entidad_id | int(4) | NO | | 0 | |
Tabla entidades
| Field | Type | Null | Key | Default | Extra |
| entidad_id | int(4) | NO | | 0 | |
emmm bien ya resolvi mi problema y fue que dada la celeridad con la que lo intente (debido a que en las pruebas todo salio bien) olvide por completo que la tabla de entidades no tenia una PK asignada en el campo que se referencia como FK en la tabla cti…
no me queda d eotra mas que decir: http://content.ytmnd.com/content/0/c/3/0c36b933b5ab957fbea475b5d612b1fe.jpg
jajajaja gracias.
jaja y aqui comiendome el tarro leyendo esto jaja
Mmmm y que puede ser si la tabla que trato de crear es la primera en ser creada, no tiene ninguna llave foranea y me manda ese código de error??
Yo tuve este problema, en una base de datos en utf8 y utf8_unicode_ci.
Hice un «dump» de una base de datos que tenía una tabla con otro cotejamiento.
La tabla decía:
ENGINE=InnoDB DEFAULT CHARSET=latin1;
Cambié a:
ENGINE=InnoDB DEFAULT CHARSET=utf8;
Y ya no salió el error
Saludos
Hola, quero compartir un error que me sucedio y que tambien puede generarse por la imcompatibilidad de las claves foraneas en cuanto a su tipo, es decir; tengo una clave foranea que referencia a un tipo de dato numerico, pero mi clave está definida como varchar.
Ademas de esto debe definirse las fk como index para tablas innodb y ojalá crear las constraint una vez que se haya vaciado completamente la base de datos.
slds!!
Hola, alguna otra razon de este error???
Otra razón por la que arroja ese error es por el tipo de tabla.. recuerden que si una es tipo MyIsam y la Otra InnoDB.. pues arrojará error 150.. pilas con eso también…
Bendito ese día que te decidiste a postear este error.
Abrazo.
Muchas gracias… en verdad me sirvio tu informacion, justo mi problema era el tipo de datos incompatibles, cree la estructura de mi base de datos con la herramienta MySQL Workbench (muy recomendable), pero en alguna parte hice la modificacion de los tipos de datos y no lo actualice en todas mis tablas y cuando me genero el script no me di cuenta del problema, pero ya se resolvio… Gracias de nuevo!!!
1000 Gracias.
Me ha ayudado mucho!
Era por el segundo de los casos.
PD: El mensaje de error no ayuda mucho 🙁
Hola… ya revisé todo: motor de las tablas, tipo de datos, cotejamiento, índices, nulls, etc… todo al parecer está bien… pero me sigue saliendo ese error… existe otra razón por la cual salga este error?
Yo acabo de tener ese error. Resulta que tenía una tabla de idiomas, y el PK era CHAR(3). Una tabla de libros tenía una FK al idioma, pero mientras que la tabla de libros tenía collation en utf8, la de idiomas no. Cuando ambas tuvieron su collation en utf8 el error desapareció.
En resumen, revisen collation de campos CHAR.
Gracias por este post, me ayudo a resolver mi problema
Por si le sirve a alguien:
Yo me he estado volviendo loco con el mismo problema, el TIPO DE DATO era idéntico. en ambos casos era un VARCHAR(36) que utilizo para almacenar como claves primarias un UUID estándar en formato «string».
Sin embargo al ser texto, tienen asociado un «código de caracteres» y una tabla se creó con el charset con «UTF» y otra con el «LATIN».
No enlazaban por eso.
Cambiando el charset para ser todo coherente (ambos a utf8 o ambos a latin) ya me dejó crear la FOREIGN KEY sin el error del «can’t create table…»
En mi caso fue por las tablas, una InnoDB y la otra MyIsam.
Muchas gracias a todos
Porque extraña razón el MySQL Workbench me puso un campo que debia ser INT como DATETIME es algo que no comprendo… ¡gracias!
Este error puede ser también por que la llave foránea de la tabla está haciendo referencia a un campo de la otra tabla que no es llave primaria, como sabemos las llaves foráneas deben hacer referencia a las llaves primarias de las tablas con las que las estamos relacionando.
MySQL permite usar
CREATE TABLE tabla2 ( j INT REFERENCES tabla1 (i) );
Con tabla1.i primary key, auto increment, not null, etc.
Pero si se usa la sintaxis
CREATE TABLE tabla2 (
j INT, FOREIGN KEY (j) REFERENCES tabla1(i) );
Dará este error porque entonces espera que j sea también NOT NULL.
Gracias
Me estaba volviendo ya loca.
Mi problema era por el tipo de dato, o más bien pq en unos sitios los tenia como not null y en otros no.
Lo dicho… gracias 🙂
la verdad muchas gracias hermano… muy buen dato!!!
muchas gracias por el aporte hermano la verdad que me saco la pata del barro….!!!
gracias a fdhs tu caso era el mismo mio.. gracias!
[Otra razón por la que arroja ese error es por el tipo de tabla.. recuerden que si una es tipo MyIsam y la Otra InnoDB.. pues arrojará error 150.. pilas con eso también…]
Esto resolvio mi problema, muchas gracias.
Otro que ha caído como David en la misma! No había creado la primary key en la tabla a enlazar por lo que evidentemente no se podía crear la clave foránea!
Sólo para dar las gracias a la gente que postea que siempre viene bien ayudarse unos a otros. Un saludo gente!
Gracias se solucionó
muchas graciass mi hermanoo la verdad ese error suele pasar………
buen aportt!! C:
tengo un problema parecido
http://www.esdebian.org/foro/43549/tabla-no-aceptada-mysql-4024debian-10sarge3-log
A mi me marca error 150 al crear la tabla pero no estoy definiendo llaves foraneas. Es la primer tabla en ser creada.
Porque marca error ?
Tabla:
CREATE TABLE `tblcategorias_articulo` (
`intCategoriaArticulo` int(11) NOT NULL AUTO_INCREMENT,
`strNombre` varchar(100) CHARACTER SET latin1 NOT NULL,
`strDescripcion` varchar(300) CHARACTER SET latin1 NOT NULL,
`bytEstatus` smallint(6) NOT NULL DEFAULT ‘0’,
`strUsuarioAlta` varchar(100) CHARACTER SET latin1 NOT NULL,
`datFechaAlta` datetime NOT NULL,
`strUsuarioMod` varchar(100) CHARACTER SET latin1 DEFAULT NULL,
`datFechaMod` datetime DEFAULT NULL,
PRIMARY KEY (`intCategoriaArticulo`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
Gracias!!!
eso era
Yo resolvi el problema de la siguiente forma: el problema radicaba en que los tipos de tablas creadas eran diferentes una tabla era MYISAM y la otra era INNODB.
God bless you!!
Me has ahorrado con este «truco» o esta chivada un buen rato 😀
Gracias!!
AL FINNNNNNNNNNNN.
El problema mio era que tenia en las FK el nombre de las tablas con algunas letras mayusculas, y como el servidor donde esta la BD es linux las tablas de referencia estaban creadas en minusculas.
muchas gracias porque tratando de buscar las soluciones puestas encontre este tonto error.
saludos
Pues efectivamente, a mi no es la primera vez que me pasa. Y como siempre pasa tiempo entre que hago una base de datos y otra siempre se me olvida xD.
Muchas gracias!!!!!!!!!
muchas gracias amigo que buena ayuda brindaste con eso
A mi me salta el error aún cuando no tengo esos defectos estructurales. Pero estaba creando una FK por cada campo cuando en realidad hacia referencia a una llave compuesta, entonces hice una sola FK que hiciera referencia a todos los campos de la llave compuesta y dejó de molestar el error.
Saludos
Que alguien me ayude, he comprobado la codificacion de las tablas, codificacion de los campos, que sean exactamente del mismo tipo y que admitan exactamente lo mismo y sigue sin dejarme.
Esto me dice:
ERROR 1005: Can’t create table ‘shooterbd.#sql-430_af’ (errno: 150)
SQL Statement:
ALTER TABLE `shooterbd`.`bot`
ADD CONSTRAINT `USUARIOSFK`
FOREIGN KEY (`propietario` )
REFERENCES `shooterbd`.`usuario` (`nombre` )
ON DELETE CASCADE
ON UPDATE CASCADE
, ADD INDEX `USUARIOSFK` (`propietario` ASC)
ERROR: Error when running failback script. Details follow.
ERROR 1046: No database selected
SQL Statement:
CREATE TABLE `bot` (
`idBot` int(11) NOT NULL AUTO_INCREMENT,
`propietario` varchar(20) NOT NULL,
`posicion_lat` bigint(20) NOT NULL DEFAULT ‘0’,
`posicion_lon` bigint(20) NOT NULL DEFAULT ‘0’,
`destino_lat` bigint(20) NOT NULL DEFAULT ‘0’,
`destino_lon` bigint(20) NOT NULL DEFAULT ‘0’,
PRIMARY KEY (`idBot`,`propietario`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
Quería comentarles, que a mi me acaba de suceder ese error y no era ninguna de esas dos opciones, sino una tercera:
* cuando ya existe en otra tabla el nombre de la clave foranea que estas creando tira este susodicho error.
saludos