MySql无法生成列auto_increment

San*_*rck 46 mysql sql mysql-error-1062

我有一个表"Bestelling"有4列:"Id"(PK),"KlantId","Datum","BestellingsTypeId",现在我想让列Id auto_increment,但是,当我尝试这样做时,我得到这个错误:

ERROR 1062: ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'

SQL Statement:

ALTER TABLE `aafest`.`aafest_bestelling` CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT



ERROR: Error when running failback script. Details follow.



ERROR 1046: No database selected

SQL Statement:

CREATE TABLE `aafest_bestelling` (

  `Id` int(11) NOT NULL,

  `KlantId` int(11) DEFAULT NULL,

  `Datum` date DEFAULT NULL,

  `BestellingstypeId` int(11) DEFAULT NULL,

  PRIMARY KEY (`Id`)

) ENGINE=InnoDB DEFAULT CHARSET=latin1
Run Code Online (Sandbox Code Playgroud)

有人有个主意吗?

Sys*_*dox 138

如果表包含id为0(或负数)的现有记录,则会发生这种情况.更新所有现有记录以使用正值将允许在该列上设置auto_increment.

编辑:有人问到0是如何进入的.为了澄清,MySQL参考手册指出"对于数字类型,默认值为0,但对于使用AUTO_INCREMENT属性声明的整数或浮点类型,默认值是序列中的下一个值." 因此,如果在启用auto_increment之前在表上执行了插入而未提供数值列的值,则在插入期间将使用默认值0.有关详细信息,访问https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html.

  • 之后,如果需要,您可以将ID更改回0 (4认同)
  • 我不建议 - 我怀疑它会在以后再次引起问题 (2认同)

小智 37

我在尝试将列转换为auto_increment时遇到此问题,其中一行的值为0.暂时更改0值的替代方法是通过设置:

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';
Run Code Online (Sandbox Code Playgroud)

为会议.

这允许将列更改为auto_increment,并使用零id.

零不理想 - 我也不建议在auto_increment列中使用它.不幸的是,它是继承数据集的一部分,所以我暂时坚持使用它.

最好在之后清除设置(以及任何其他设置):

SET SESSION sql_mode='';
Run Code Online (Sandbox Code Playgroud)

虽然它会在当前客户端会话清除时被清除.

有关'NO_AUTO_VALUE_ON_ZERO'设置的详细信息,请点击此处.

  • 从我的角度来看,对于PK列中包含零的现有数据,这是最平滑的方法.我非常感激,节省了我很多时间! (2认同)

Arn*_*anc 14

当MySQL无法确定正确的auto_increment值时会发生这种情况.在您的情况下,MySQL选择1下一个auto_increment值,但是表中已存在具有该值的行.

解决此问题的一种方法是自己选择合适的auto_increment值:

ALTER TABLE ... CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 123456;
Run Code Online (Sandbox Code Playgroud)

(注意AUTO_INCREMENT=123456最后.)

  • 正是我需要的。我不敢相信这个答案在列表中没有更高。 (2认同)

Eve*_*ert 13

编辑:不知道究竟是怎么造成的,但我确实有一个解决方法.

首先,创建一个像旧的表一样的新表:

CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling;
Run Code Online (Sandbox Code Playgroud)

然后更改列

ALTER TABLE `aafest`.`aafest_bestelling_new` 
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
Run Code Online (Sandbox Code Playgroud)

转储新数据:

INSERT INTO aafest_bestelling_new
 (KlantId, Datum, BestellingTypeId) 
SELECT 
KlantId, Datum, BestellingTypeId 
FROM aafest_bestelling;
Run Code Online (Sandbox Code Playgroud)

移动表格:

RENAME TABLE 
aafest_bestelling TO aafest_bestelling_old, 
aafest_bestelling_new TO aafest_bestelling;
Run Code Online (Sandbox Code Playgroud)

也许有一些腐败正在发生,这也将解决这个问题.

PS:作为荷兰人,我强烈建议用英文编码;)

  • -1这不应该是接受的答案.当你有一个id为0的记录时会发生这个错误.如果你删除id为0的记录,那么可以添加auto_increment而不会出错.这是解决方案.这里接受的答案更复杂且容易出错,可能导致表之间的数据完整性问题,并且会导致更长的停机时间.只需删除id为0的记录,然后再次运行alter table语句. (45认同)

小智 9

我找到解决此问题的最简单方法是AUTO INCREMENT在更改列之前首先设置表的值.只需确保将自动增量值设置为高于该列中当前的最大值:

ALTER TABLE `aafest`.`aafest_bestelling` 
AUTO_INCREMENT = 100, 
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
Run Code Online (Sandbox Code Playgroud)

我在MySQL 5.7上测试了这个,它对我很有用.


Jam*_*vec 6

我有类似的问题。ID = 0问题是该表有一条与 SystemParadox 指出的类似的记录。我通过以下步骤处理了我的问题:

脚步:

  1. 将记录 id 0 更新为x所在位置x = MAX(id)+1
  2. 修改表设置主键和自增设置
  3. 将种子值设置为x+1
  4. 将记录 ID 更改x0

代码示例:

UPDATE foo SET id = 100 WHERE id = 0;
ALTER TABLE foo MODIFY COLUMN id INT(11) NOT NULL AUTO_INCREMENT;
ALTER TABLE foo AUTO_INCREMENT = 101;
UPDATE foo SET id = 0 WHERE id = 100;
Run Code Online (Sandbox Code Playgroud)