Asunto: Error 1005 150 al crear clave foránea foreign key
Estoy tratando de ejecutar la siguiente sentencia SQL en MySQL Server 5 para crear una clave foránea de la tabla "usuario", en el campo "codigocliente" a la tabla "cliente" en el campo "id", la consulta SQL que uso para ello es:
Código:
ALTER TABLE tabla_usuario
ADD CONSTRAINT FK_usuario_cliente
FOREIGN KEY FK_usuario_cliente (codigocliente)
REFERENCES tabla_cliente (id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
ROW_FORMAT = DYNAMIC;
Pero al ejecutarla me da este error:
Error while executing query.
ALTER TABLE tabla_usuario
ADD CONSTRAINT FK_usuario_cliente
FOREIGN KEY FK_usuario_cliente (codigocliente)
REFERENCES tabla_cliente (id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
ROW_FORMAT = DYNAMIC;
MySQL Error Number 1005
Can't create table 'bdvisualizadorlog.#sql-61d_14d4' (errno: 150)
¿A qué puede ser debido? ¿MySQL Server 5 no admite claves foráneas?
Estoy tratando de ejecutar la siguiente sentencia SQL en MySQL Server 5 para crear una clave foránea de la tabla "usuario", en el campo "codigocliente" a la tabla "cliente" en el campo "id", la consulta SQL que uso para ello es:
Código:
ALTER TABLE tabla_usuario
ADD CONSTRAINT FK_usuario_cliente
FOREIGN KEY FK_usuario_cliente (codigocliente)
REFERENCES tabla_cliente (id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
ROW_FORMAT = DYNAMIC;
Pero al ejecutarla me da este error:
Error while executing query.
ALTER TABLE tabla_usuario
ADD CONSTRAINT FK_usuario_cliente
FOREIGN KEY FK_usuario_cliente (codigocliente)
REFERENCES tabla_cliente (id)
ON DELETE RESTRICT
ON UPDATE CASCADE,
ROW_FORMAT = DYNAMIC;
MySQL Error Number 1005
Can't create table 'bdvisualizadorlog.#sql-61d_14d4' (errno: 150)
¿A qué puede ser debido? ¿MySQL Server 5 no admite claves foráneas?
A partir de la versión 3.23.44 de MySQL Server ya están soportadas las claves foráneas o foreign keys.
El error que nos comentas puede ser debido a varios motivos:
1. Para poder usar las FOREIGN KEYS el motor (engine) debe ser InnoDB. Tanto la tabla origen como la foránea deben ser de tipo InnoDB. Asegúrate de esto.
Para convertir una tabla MyISAM a InnoDB puedes usar:
Código:
ALTER TABLE nombre_tabla ENGINE = InnoDB;
2. En las claves foráneas FOREIGN KEYS el campo seleccionado en la tabla origen y el campo de la tabla foránea deben ser del mismo tipo de datos.
3. Obviamente, tanto la tabla origen como la de destino (foránea) deben existir. También deben existir los campos origen y foráneo.
A partir de la versión 3.23.44 de MySQL Server ya están soportadas las claves foráneas o foreign keys.
El error que nos comentas puede ser debido a varios motivos:
1. Para poder usar las FOREIGN KEYS el motor (engine) debe ser InnoDB. Tanto la tabla origen como la foránea deben ser de tipo InnoDB. Asegúrate de esto.
Para convertir una tabla MyISAM a InnoDB puedes usar:
Código:
ALTER TABLE nombre_tabla ENGINE = InnoDB;
2. En las claves foráneas FOREIGN KEYS el campo seleccionado en la tabla origen y el campo de la tabla foránea deben ser del mismo tipo de datos.
3. Obviamente, tanto la tabla origen como la de destino (foránea) deben existir. También deben existir los campos origen y foráneo.
Lo cumplo todo salvo un pequeño detalle que no creo que sea: el campo "origen" en mi caso "codigocliente" de la tabla "origen" en mi caso "tabla_usuario" es de tipo INT(11), al igual que el campo "id" de la tabla foránea "tabla_cliente". Aunque veo una pequeña diferencia y es que en la tabla origen está marcado UNSIGNED y en la foránea no ¿puede ser esta "tontería"?
Lo cumplo todo salvo un pequeño detalle que no creo que sea: el campo "origen" en mi caso "codigocliente" de la tabla "origen" en mi caso "tabla_usuario" es de tipo INT(11), al igual que el campo "id" de la tabla foránea "tabla_cliente". Aunque veo una pequeña diferencia y es que en la tabla origen está marcado UNSIGNED y en la foránea no ¿puede ser esta "tontería"?
Sí, de hecho, de cara a MySQL el tipo de datos de los campos "codigocliente" y "id" que nos comentas no sería igual, uno es UNSIGNED y el otro no.
Para cambiar esto puedes ejecutar la siguiente consulta SQL:
Código:
ALTER TABLE tabla_usuario MODIFY COLUMN codigocliente INT(11) NOT NULL AUTO_INCREMENT;
Ejecútala también para la tabla "tabla_cliente" así te aseguras que en ambos casos es el mismo tipo:
Código:
ALTER TABLE tabla_cliente MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
O bien, donde has visto el check de UNSIGNED marcado (si es en MySQL Administrator) lo desmarcas y guardas los cambios.
Cuando hayas dejado el mismo tipo de datos en ambos campos de ambas tablas vuelve a probar a ejecutar la consulta para crear la clave foránea.
Publicado:
Mar Abr 26, 2011 8:56 am
varios Magnífico usuario
Registrado: Oct 10, 2006 Mensajes: 2092
Asunto: [SOLUCIONADO] Error 1005 150 al crear foreign key
Anuncios
alonsojpd escribió:
Sí, de hecho, de cara a MySQL el tipo de datos de los campos "codigocliente" y "id" que nos comentas no sería igual, uno es UNSIGNED y el otro no.
Para cambiar esto puedes ejecutar la siguiente consulta SQL:
Código:
ALTER TABLE tabla_usuario MODIFY COLUMN codigocliente INT(11) NOT NULL AUTO_INCREMENT;
Ejecútala también para la tabla "tabla_cliente" así te aseguras que en ambos casos es el mismo tipo:
Código:
ALTER TABLE tabla_cliente MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
O bien, donde has visto el check de UNSIGNED marcado (si es en MySQL Administrator) lo desmarcas y guardas los cambios.
Cuando hayas dejado el mismo tipo de datos en ambos campos de ambas tablas vuelve a probar a ejecutar la consulta para crear la clave foránea.
Ok, efectivamente era el tipo de datos de ambos campos, ya está solucionado y funciona correctamente.
Muchas gracias.
Publicado:
Mar Abr 26, 2011 8:57 am
steveagente Usuario
Registrado: Apr 08, 2013 Mensajes: 1
Asunto: Maestro!!!!
Eres un genio maestro, gracias por darnos la solución ahora ya puedo relacionar mis tablas, mi problema era la diferencia del tipo de datos. nuevamente muchas gracias Maestro
Puede publicar nuevos temas en este foro No puede responder a temas en este foro No puede editar sus mensajes en este foro No puede borrar sus mensajes en este foro No puede votar en encuestas en este foro
Visita nuestro nuevo sitio web con programas y contenidos actualizados: Proyecto A