243

我收到关于 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' 
4

9 回答 9

597

很可能您已经有名称iduseridcategory数据库中的约束。如果是这样,只需重命名约束。

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

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

SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');
于 2013-08-05T11:54:22.883 回答
32

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

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

于 2014-12-19T20:47:41.720 回答
15

Resolved SuccessfullyNaming Convention两个链接,我轻松解决了我面临的同样问题。即,对于外键名称,给出fk _colName_ TableName。此命名约定是明确的,并且还使您的 DB 模型中的每个 ForeignKey 都是唯一的,您将永远不会收到此错误。

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

于 2015-04-28T06:09:00.870 回答
8

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

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

fk_TableName_ColumnName

要调查是否存在可能的冲突,您可以使用此查询列出数据库使用的所有约束:

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

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

于 2018-06-04T01:49:30.827 回答
4

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

2.3.0 中发布了一个修复程序。

有关详细信息,请参阅https://bugs.launchpad.net/percona-toolkit/+bug/1498128 。

于 2016-03-29T16:00:01.153 回答
4

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

您可以重命名约束。我在我的后面附加了一个数字,这样我就可以轻松地追踪出现的次数。

例子

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

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

于 2017-10-23T08:24:54.607 回答
2

创建新表时遇到了这个问题。原来我给的外键名已经被使用了。重命名密钥修复它。

于 2018-02-08T00:33:55.573 回答
1

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

于 2014-12-11T02:36:59.413 回答
0

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

tablename_columnname_fk
于 2020-07-27T19:34:39.310 回答