manejo - mysql#1005 no puedo crear tabla
Error de MySQL 1022 al crear tabla (3)
El problema es que el nombre de una clave externa no puede ser igual a otra clave externa en todo el modelo.
Imagina esta situacion
Catálogo -> Proveedor
Producto -> Proveedor
Si el nombre de la clave foránea en la tabla Catálogo para el proveedor es "proveedor" y usted asignó el mismo nombre en la tabla de productos, los nombres de las claves foráneas "colisionarán".
Necesitas nombrarlos de manera diferente ..
Por ejemplo:
catalog_supplier product_supplier
MySQL Workbench creó el siguiente SQL para crear una tabla:
CREATE TABLE IF NOT EXISTS `mydb`.`errors_reports` (
`error_id` INT NOT NULL ,
`report_short` VARCHAR(15) NOT NULL ,
PRIMARY KEY (`error_id`, `report_short`) ,
INDEX `error_id_idx` (`error_id` ASC) ,
INDEX `report_short_idx` (`report_short` ASC) ,
CONSTRAINT `error_id`
FOREIGN KEY (`error_id` )
REFERENCES `mydb`.`errors` (`error_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `report_short`
FOREIGN KEY (`report_short` )
REFERENCES `mydb`.`reports` (`report_short` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB
que me parece bien, y hay un montón de otras tablas muy similares en mi base de datos que MySQL estaba perfectamente feliz de crear.
Pero este ...
ERROR 1022 (23000): Can''t write; duplicate key in table ''errors_reports''
Por mi vida no puedo ver ninguna clave duplicada aquí. Sólo hay una clave definida!
Estoy ejecutando MySQL 5.6 con una nueva instalación por defecto. No hay nada en el registro de errores.
Ideas?
Edición: a través de un proceso de eliminación (volviendo a la definición más simple posible de la tabla, y luego agregando bits de nuevo gradualmente) el problema parece ser este bit:
CONSTRAINT `error_id`
FOREIGN KEY (`error_id` )
REFERENCES `mydb`.`errors` (`error_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
lo que es particularmente extraño ya que hay un código idéntico en varias otras definiciones de tabla y ¡están perfectamente bien!
Intente usar INSERT IGNORE
lugar de INSERT
donde INSERT IGNORE no insertará una nueva fila si se encuentra una clave principal duplicada. Esto debería ayudar a resolver el problema temporalmente, pero recomendaría truncar la tabla.
Parece que estás creando un índice en las columnas de clave externa. Al crear una clave externa en InnoDb, una se creará automáticamente.