错误1022 – 无法写入; 表中重复键
我得到一个关于创build表命令重复键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'
您可能已经在数据库中使用了名称iduser
或idcategory
。 只要重新命名约束。
在MySQL中更改外键名称。 数据库表中不能有相同的外键名称。
检查所有的表和所有的外键,并避免有两个具有相同的确切名称的外键。
从“ 成功解决”和“ 命名公约”这两个环节,我轻松解决了我面临的同样的问题。 即对于外键名称,给出为fk _colName_ TableName 。 这个命名约定是非歧义的,也使得您的数据库模型中的每个ForeignKey都是唯一的,您将永远不会得到这个错误。
错误1022:无法写入; 表中重复键
这也可能与Percona Toolkit在线模式更改工具的某些版本中的错误有关。 要改变一个大表,pt-osc首先创build一个重复的表,并将所有的logging复制到其中。 在某些情况下,某些版本的pt-osc 2.2.x会试图给新表上的约束与旧表上的约束相同的名称。
在2.3.0中发布了一个修复程序。
有关更多详细信息,请参阅https://bugs.launchpad.net/percona-toolkit/+bug/1498128 。
我也遇到了这个问题。检查数据库名称是否已经存在于Mysql中,并重命名旧的。
我刚刚在同一个问题上花了最后4个小时。 我所做的只是确保约束具有独特的名称。
您可以重新命名约束。 我附加了一个号码给我的,所以我可以很容易地跟踪发生的次数。
例
如果表中的约束被命名为带外键的boy X那么外键X的下一个约束可以被称为boy1
我相信你会找出比我更好的名字。 🙂