我在create table命令上遇到关于重复键的1022错误。查看了查询后,我无法理解重复发生的位置。谁能看到它吗?
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'
答案 0 :(得分:447)
您最有可能在数据库中使用名称为iduser
或idcategory
的约束。如果是这样,只需重命名约束。
整个数据库的约束必须是唯一的,而不仅仅是您正在创建/更改的特定表。
要找出当前使用约束的位置,您可以使用以下查询:
SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');
答案 1 :(得分:27)
更改MySQL中的外键名称。您不能在数据库表中具有相同的外键名称。
检查所有表和所有外键,避免使用两个具有相同名称的外键。
答案 2 :(得分:13)
来自两个链接Resolved Successfully和Naming Convention, 我轻松解决了我遇到的同样问题。即,对于外键名称,请指定为 fk _colName_ TableName 。这个命名约定是非模糊的,并且使您的数据库模型中的每个ForeignKey都是唯一的,您将永远不会收到此错误。
错误1022:无法写入;表中的重复键
答案 3 :(得分:3)
我刚刚用同样的问题花了4个小时。我所做的只是确保约束具有唯一的名称。
您可以重命名约束。我在我的附加了一个数字,所以我可以很容易地追踪出现次数。
示例
如果表中的约束被命名为带有外键X的boy 外键X的下一个约束可以称为boy1
我确定你能找出比我更好的名字。
答案 4 :(得分:3)
正如其他人所提到的那样,您的约束的名称已经被数据库中的另一个表使用了。它们在整个数据库中必须是唯一的。
命名外键约束的一个好惯例是:
fk_TableName_ColumnName
要调查是否存在可能的冲突,您可以使用此查询列出数据库使用的所有约束:
SELECT * FROM information_schema.table_constraints WHERE constraint_schema = 'YOUR_DB';
当我运行此查询时,我发现我之前已经创建了一个表的临时副本,并且此副本已经使用了我试图使用的约束名称。
答案 5 :(得分:2)
这也可能与某些版本的Percona Toolkit的在线架构更改工具中的错误有关。为了改变一个大表,pt-osc首先创建一个重复的表并将所有记录复制到其中。在某些情况下,某些版本的pt-osc 2.2.x会尝试在新表上给出与旧表约束相同的约束。
修复程序在2.3.0中发布。
有关详细信息,请参阅https://bugs.launchpad.net/percona-toolkit/+bug/1498128。
答案 6 :(得分:1)
我也遇到了这个问题。检查Mysql中是否已经存在数据库名称,并重命名旧的。
答案 7 :(得分:0)
创建新表时遇到此问题。事实证明我给出的外键名称已经在使用中。重命名键修复它。
答案 8 :(得分:0)
您可能正在尝试在某个表中创建外键,该表在先前存在的表中具有相同的名称。 使用以下格式命名您的外键
tablename_columnname_fk