错误1022 -不能写;表中重复的键

我得到一个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'
226127 次浏览

最有可能的情况是,您的数据库中已经有名称为iduseridcategory的约束。如果是,就重命名约束。

约束对于整个数据库必须是唯一的,而不仅仅是您正在创建/修改的特定表。

要找出当前使用的约束,您可以使用以下查询:

SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');

我也遇到过这个问题。检查Mysql中是否已经存在数据库名称,并重命名旧的数据库名称。

修改MySQL中的外键名称。数据库表中不能有相同的外键名。

检查所有表和所有外键,避免使用名称完全相同的两个外键。

从两个链接__abc0和命名约定, 我很容易就解决了这个问题。例如,对于外键名称,给出< em >颗< / em > _colName_ < em >表名< / em >。这个命名约定是明确的,并且使你的DB模型中的每个ForeignKey都是唯一的,你永远不会得到这个错误

错误1022:不能写;表中重复的键

这也可能与某些版本的Percona Toolkit的在线模式更改工具中的错误有关。要改变一个大表,pt-osc首先创建一个重复表,并将所有记录复制到其中。在某些情况下,某些版本的pt-osc 2.2。X将尝试为新表上的约束提供与旧表上的约束相同的名称。

2.3.0版本发布了修复。

更多细节参见https://bugs.launchpad.net/percona-toolkit/+bug/1498128

我刚刚花了4个小时处理同样的问题。我所做的只是确保约束具有唯一的名称。

您可以重命名约束。我在我的数字后面加上了一个数字,这样我就可以很容易地追踪到出现的次数。

例子

如果表中的约束名为boy,外键为X 下一个具有外键X的约束可以称为boy1

我相信你能想出比我更好的名字。🙂

我在创建新表时遇到了这个问题。结果发现我给出的外键名称已经被使用了。重命名键修复了它。

正如其他人所提到的,约束的名称已经被DB中的另一个表使用。它们在数据库中必须是唯一的。

命名外键约束的一个好的约定是:

fk_TableName_ColumnName

为了调查是否有可能的冲突,你可以用这个查询列出你的数据库使用的所有约束:

SELECT * FROM information_schema.table_constraints WHERE constraint_schema = 'YOUR_DB';

当我运行这个查询时,我发现我之前已经创建了一个表的临时副本,并且这个副本已经使用了我试图使用的约束名。

您可能正在尝试在某个表中创建一个外键,该表在先前存在的表中具有相同的名称。 使用以下格式将外键命名为

tablename_columnname_fk