Ayer me apareció este error al tratar de ejecutar un DDL en una base de datos MySQL. El script estaba compuesto por varias sentencias de creación de tablas con primary keys, foreign keys e índices.
Este error aparece cuando estamos duplicando información de algún objeto de la base de datos en una sentencia CREATE TABLE . Una de las razones por la que se produce puede ser que la tabla ya exista en el diccionario de datos interno de la BBDD por algún proceso anterior y no se haya limpiado correctamente. Otro motivo, que es el que a mí me estaba provocando el error, es un conflicto de nombres entre foreign keys, ya que los nombres de éstas también deben de ser únicos en la BBDD, al igual que los nombres de las tablas, índices, vistas, etc.
Solución
La solución para mi caso, por tanto, es personalizar el nombre de cada Foreign Key. El ejemplo expuesto a continuación lo he tomado de mi script. Tenemos una tabla de hechos donde almacenamos la información de tiendas (t_tiendas) y dos tablas auxiliares donde vamos a guardar opiniones de cada tienda e imágenes de éstas (t_tiendas_img y t_tiendas_opn). Estas dos tablas tienen como foreign key el id_tienda de la fact table y el error que cometí fue denominar a ambas con el mismo nombre. Para corregirlo, simplemente asignamos un nombre distinto a cada foreign key (id_tienda_img e id_tienda_opn).
CREATE TABLE IF NOT EXISTS `t_tiendas_opn` (
`id_tienda` INT NOT NULL ,
`txt_opinion` MEDIUMTEXT NOT NULL ,
`valoracion` INT NOT NULL ,
PRIMARY KEY (`id_tienda`) ,
CONSTRAINT `id_tienda_opn`
FOREIGN KEY (`id_tienda` )
REFERENCES `t_tiendas` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
CREATE TABLE IF NOT EXISTS `t_tiendas_img` (
`id_tienda` INT NOT NULL ,
`path_img` VARCHAR(120) NOT NULL ,
PRIMARY KEY (`id_tienda`) ,
CONSTRAINT `id_tienda_img`
FOREIGN KEY (`id_tienda` )
REFERENCES `t_tiendas` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
[…] This post was mentioned on Twitter by Marcos, Tendencias OK. Tendencias OK said: Cómo solucionar MySQL Error #1005 – Can't create table (errno: 121 …: Suscríbete a nuestro Feed para recibir l… http://bit.ly/gjZuUc […]
ohhh!!!! muchas gracias esta info me sirvio bastante, tengo q entregar un proyecto y me salia este error y no sabia como solucionarlo, de verdad mil gracias
GRACIASSSS!!!!!!!!!
Después de horas de batallar con este problema, tú me lo has resuelto de la forma más fácil posible. Te lo agradezco mucho.
Me Salvaste….
Buena info
Claro y conciso.GRACIAS!
Me alegro de que te fuera útil.
Perfecto !!!!!!!!!!!!!!!!! Simple y claro 🙂
Hola muy buen aporte, muchas gracias pude solucionar este problema de fk con nombres repetidos.. me traia hace un rato atascado
Gracias
Muchos Saludos
muy buen aporte gracias….
a mi me sale el error en esta parte de mi script:
…
…
CREATE TABLE IF NOT EXISTS `noticia_importante` (
`imp_id` int(11) NOT NULL AUTO_INCREMENT,
`imp_titulo` varchar(255) NOT NULL,
`imp_descripcion` varchar(255) NOT NULL,
`imp_fecha_creacion` datetime NOT NULL,
`imp_estado` int(2) NOT NULL,
PRIMARY KEY (`imp_id`) — <– aqui
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ;
…
…
pueden ayudarme
Jorge,
Yo la puedo crear sin ningún problema, ¿podrías publicar el resto del script? probablemente haya otra tabla que esté entrando en conflicto con ésta.
un saludo
hola Nagash gracias por responder
lo solucione cambiando a
……..
ENGINE=InnoDB a ENGINE=MyISAM y está todo bien
saludos
Genial 😉
Chido gracias por el aporte
Gracias por la orientacion!!!
Me alegro de que os haya sido útil a todos 😉
Un saludo
Muchas gracias!! Me sirvio de mucho 🙂
Despues de pelear varias horas encontre este dato muchas gracias ahora puedo terminar de relacionar mi base de datos
Me alegro mucho de que os haya sido de utilidad @Monica e @Isaac