Cómo solucionar el error de MySQL #1005 – Can’t create table (errno: 121)
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.
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)