59

我有一个包含 4 列的“Bestelling”表:“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

有人有想法吗?

4

9 回答 9

161

如果表包含 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找到。

于 2011-06-24T14:58:35.873 回答
45

我在尝试将列转换为 auto_increment 时也遇到了这个问题,其中一行的值为 0。临时更改 0 值的另一种方法是通过设置:

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';

为会议。

这允许将列更改为具有零 id 的 auto_increment。

零并不理想——我也不建议在 auto_increment 列中使用它。不幸的是,它是继承数据集的一部分,所以我现在坚持使用它。

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

SET SESSION sql_mode='';

虽然它会在当前客户端会话关闭时被清除。

此处有关“NO_AUTO_VALUE_ON_ZERO”设置的完整详细信息。

于 2012-02-28T15:37:54.703 回答
23

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

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

ALTER TABLE ... CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT = 123456;

(注意AUTO_INCREMENT=123456最后的。)

于 2014-12-11T10:07:33.770 回答
14

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

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

我在 MySQL 5.7 上对此进行了测试,对我来说效果很好。

于 2016-04-24T21:06:17.460 回答
13

编辑:不知道这到底是怎么引起的,但我确实有一个解决方法。

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

CREATE TABLE aafest_bestelling_new LIKE aafest_bestelling;

然后更改列

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

转储新数据:

INSERT INTO aafest_bestelling_new
 (KlantId, Datum, BestellingTypeId) 
SELECT 
KlantId, Datum, BestellingTypeId 
FROM aafest_bestelling;

移动表格:

RENAME TABLE 
aafest_bestelling TO aafest_bestelling_old, 
aafest_bestelling_new TO aafest_bestelling;

也许有一些腐败正在发生,这也可以解决这个问题。

PS:作为一个荷兰人,我强烈推荐用英语编码;)

于 2011-03-23T09:14:53.563 回答
3

I had a similar issue. Issue was the table had a record with ID = 0 similar to what SystemParadox pointed out. I handled my issue by the following steps:

Steps:

  1. Update record id 0 to be x where x = MAX(id)+1
  2. Alter table to set primary key and auto increment setting
  3. Set seed value to be x+1
  4. Change record id x back to 0

Code Example:

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;
于 2018-04-10T21:54:28.113 回答
2

发生这种情况是因为您的主键列已经有值。

正如错误所说......

ALTER TABLE 导致 auto_increment 重新排序,导致键 'PRIMARY' 的重复条目 '1'

这意味着您的列已经有一个主键值1,当您 auto_increment 重新分配该列时会导致重复,因此会出现此错误

对此的解决方案是删除主要约束,然后清空该列。然后再次更改设置主键的表,这次使用自动增量。

于 2014-04-03T12:14:57.197 回答
2

出现此错误是因为 any 表包含 id 为 0(或负数)的现有记录。更新所有现有记录以使用正值将允许在该列上设置 auto_increment。如果这不起作用,则导出所有数据并将其保存在计算机中的任何位置,不要先建立外键关系,然后将数据填充到父表中。

于 2020-09-11T10:07:43.353 回答
0

AUTO_INCREMENT PRIMARY KEY如果有一个 MyISAM 表,它有一个组合并且试图组合键,也会发生这个错误

例如

创建表 test1 (
 `id` int(11) NOT NULL,
 `ver` int(10) unsigned NOT NULL AUTO_INCREMENT,
主键(`id`,`ver`)
) 引擎=MyISAM 默认字符集=utf8;

INSERT INTO test1 (`id`, `ver`) 值 (1,NULL),(1,NULL),(1,NULL), (2,NULL),(2,NULL),(2,NULL);

ALTER TABLE test1 DROP PRIMARY KEY, ADD PRIMARY KEY(`ver`);
于 2014-03-10T09:47:39.303 回答