Recibo un error 1022 con respecto a las claves duplicadas en el comando crear tabla. Después de mirar la consulta, no puedo entender dónde se produce la duplicación. ¿Alguien más puede verlo?
SQL query:
-- -----------------------------------------------------
-- Table `apptwo`.`usercircle`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `apptwo`.`usercircle` (
`idUserCircle` MEDIUMINT NOT NULL ,
`userId` MEDIUMINT NULL ,
`circleId` MEDIUMINT NULL ,
`authUser` BINARY NULL ,
`authOwner` BINARY NULL ,
`startDate` DATETIME NULL ,
`endDate` DATETIME NULL ,
PRIMARY KEY ( `idUserCircle` ) ,
INDEX `iduser_idx` ( `userId` ASC ) ,
INDEX `idcategory_idx` ( `circleId` ASC ) ,
CONSTRAINT `iduser` FOREIGN KEY ( `userId` ) REFERENCES `apptwo`.`user` (
`idUser`
) ON DELETE NO ACTION ON UPDATE NO ACTION ,
CONSTRAINT `idcategory` FOREIGN KEY ( `circleId` ) REFERENCES `apptwo`.`circle` (
`idCircle`
) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = INNODB;
MySQL said: Documentation
#1022 - Can't write; duplicate key in table 'usercircle'
ON DELETE NO ACTION
simplemente eliminaría el uso completo de la clave externa. A menos que tenga razones muy específicas para hacerlo.Respuestas:
Lo más probable es que ya tenga una restricción con el nombre
iduser
oidcategory
en su base de datos. Simplemente cambie el nombre de las restricciones si es así.Las restricciones deben ser únicas para toda la base de datos, no solo para la tabla específica que está creando / alterando.
Para averiguar dónde se usan actualmente las restricciones, puede usar la siguiente consulta:
fuente
Cambie el nombre de la clave externa en MySQL. No puede tener los mismos nombres de clave externa en las tablas de la base de datos.
Verifique todas sus tablas y todas sus claves foráneas y evite tener dos claves foráneas con el mismo nombre exacto.
fuente
De los dos enlaces resueltos con éxito y convención de nomenclatura , resolví fácilmente este mismo problema que enfrenté. es decir, para el nombre de la clave externa, dé como fk _colName_ TableName . Esta convención de nomenclatura no es ambigua y también hace que cada ForeignKey en su modelo de base de datos sea única y nunca obtendrá este error.
fuente
Como otros han mencionado, es posible que el nombre de su restricción ya esté en uso por otra tabla en su base de datos . Deben ser únicos en la base de datos.
Una buena convención para nombrar restricciones de clave externa es:
Para investigar si hay un posible choque, puede enumerar todas las restricciones utilizadas por su base de datos con esta consulta:
Cuando ejecuté esta consulta, descubrí que previamente había hecho una copia temporal de una tabla y esta copia ya estaba usando el nombre de restricción que estaba tratando de usar.
fuente
Acabo de pasar las últimas 4 horas con el mismo problema. Lo que hice fue simplemente asegurarme de que las restricciones tuvieran nombres únicos.
Puede cambiar el nombre de las restricciones. Agregué un número al mío para poder rastrear fácilmente el número de ocurrencias.
Ejemplo
Si una restricción en una tabla se llama boy con una clave externa X La siguiente restricción con la clave externa X se puede llamar boy1
Estoy seguro de que descubrirías mejores nombres que yo. 🙂
fuente
Esto también puede surgir en relación con un error en ciertas versiones de la herramienta de cambio de esquema en línea de Percona Toolkit. Para mutar una tabla grande, pt-osc primero crea una tabla duplicada y copia todos los registros en ella. En algunas circunstancias, algunas versiones de pt-osc 2.2.x intentarán dar a las restricciones de la nueva tabla los mismos nombres que las restricciones de la tabla anterior.
Se lanzó una solución en 2.3.0.
Consulte https://bugs.launchpad.net/percona-toolkit/+bug/1498128 para obtener más detalles.
fuente
También encontré ese problema. Verifique si el nombre de la base de datos ya existe en Mysql y cambie el nombre del anterior.
fuente
Tuve este problema al crear una nueva tabla. Resulta que el nombre de la clave externa que le di ya estaba en uso. Cambiar el nombre de la clave lo arregló.
fuente