错误1022 - 无法写入;表中的重复键

时间:2013-08-05 11:13:12

标签: mysql

我在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' 

9 个答案:

答案 0 :(得分:447)

您最有可能在数据库中使用名称为iduseridcategory的约束。如果是这样,只需重命名约束。

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

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

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

答案 1 :(得分:27)

更改MySQL中的外键名称。您不能在数据库表中具有相同的外键名称。

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

答案 2 :(得分:13)

来自两个链接Resolved SuccessfullyNaming 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
相关问题