MySql无法生成列auto_increment

时间:2011-03-23 09:12:27

标签: 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

有人有个主意吗?

10 个答案:

答案 0 :(得分:121)

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

答案 1 :(得分:35)

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

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO';

为会话。

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

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

最好用以下方式清除设置(以及其他任何设置):

SET SESSION sql_mode='';

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

“NO_AUTO_VALUE_ON_ZERO”设置here的完整详情。

答案 2 :(得分: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;

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

P.S。:作为荷兰人,我强烈建议用英文编码;)

答案 3 :(得分:13)

当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。)

答案 4 :(得分:8)

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

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

我在MySQL 5.7上对此进行了测试,它对我来说很有用。

答案 5 :(得分:2)

我有类似的问题。问题是该表的记录与val lst1 =List("a/b/d=20180103","a/c/d=20180201","a/c/d=20180102","a/e/d=20180104","a/b/d=20180203") val lst2 = List("20180102", "20180103", "20180104") val ans = lst1.map { value => val firstPart = value.split('=').head val secondPart = value.split('=').last if(lst2.contains(secondPart)) { value } else { None } } ans.filter(_ != None) 类似于SystemParadox指出的记录。我通过以下步骤处理了我的问题:

<强>步骤:

  1. 将记录ID 0更新为ID = 0 <{1}}
  2. 更改表以设置主键和自动增量设置
  3. 将种子值设置为x
  4. 将记录ID x = MAX(id)+1更改回x+1
  5. 代码示例:

    x

答案 6 :(得分:1)

这是因为您的主键列已有值。

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

ALTER TABLE导致auto_increment重新排序,导致密钥'PRIMARY'重复输入'1'

这意味着您的列已经具有主键值 1 ,当您auto_increment重新分配该列时会导致重复,从而导致此错误

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

答案 7 :(得分:1)

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

答案 8 :(得分:0)

如果MyISAM表具有复合AUTO_INCREMENT PRIMARY KEY并且正在尝试合并键

,也会发生此错误

例如

CREATE TABLE test1 (
 `id` int(11) NOT NULL,
 `ver` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`,`ver`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

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

ALTER TABLE test1 DROP PRIMARY KEY, ADD PRIMARY KEY(`ver`);

答案 9 :(得分:0)

如果该表是相对新的,只有几条记录,则可以截断该表以重置ID值:

TRUNCATE TABLE tablename;

使用删除不会重置 ID值。

DELETE FROM tablename;

清空表格后,您可以应用自动增量。

CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT