2011-03-23 178 views
27

我有一个表“Bestelling”与4列:“Id”(PK),“KlantId”,“Datum”,“BestellingsTypeId”,现在我想使列Id auto_increment,但是,当我尝试这样做时,出现此错误:MySql无法创建列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 

任何人都有想法?

回答

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:作为一个荷兰人,我会强烈建议在英文编码;)

+0

咋,但列已经是PK了,所以所有的值都应该是唯一的吧? – 2011-03-23 09:15:53

+0

看看..在违反唯一性约束的状态下,我多次使用MySQL表格。 SELECT ID,COUNT(*)as aafest_bestelling GROUP BY ID HAVING count> 1; – Evert 2011-03-23 09:18:11

+0

它返回0个记录... – 2011-03-23 09:21:10

97

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

编辑:有人问这是怎么回事。为了澄清,MySQL参考手册指出:“对于数字类型,默认值为0,不同之处在于,对于使用AUTO_INCREMENT属性声明的整数或浮点类型,默认值是序列中的下一个值。”因此,如果您在启用auto_increment之前未对数字列提供值的情况下在表上执行插入操作,则在插入过程中将使用默认值0。更多细节请参见https://dev.mysql.com/doc/refman/5.0/en/data-type-defaults.html

+4

然后你可以更改ID回0如果你想 – Niels 2012-01-12 10:02:31

+2

我不建议 - 我怀疑它会再次导致问题 – SystemParadox 2012-01-20 17:25:24

+1

这正是我的问题。现在这个0怎么会进入... – Frungi 2013-12-28 10:45:10

28

我也有尝试转换列AUTO_INCREMENT其中一行通过设置了0值暂时改变0值的替代方法是当这个问题:

SET SESSION sql_mode='NO_AUTO_VALUE_ON_ZERO'; 

了会议。

这样就可以将列更改为auto_increment,并带有零ID。

零不是理想的 - 我也不会推荐它在auto_increment列中使用。不幸的是,它是一个继承的数据集的一部分,所以我现在坚持使用它。

最好清除设置(和任何其他人)与算账:

SET SESSION sql_mode=''; 

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

有关'NO_AUTO_VALUE_ON_ZERO'设置here的详细信息。

+2

从我的角度来看,这是对PK列中已有数据包含零的最平滑方法。我非常感谢,节省了很多我的时间! – sharpener 2014-06-10 08:25:21

+0

这应该有更多upvotes比它。 – 2014-08-27 19:40:56

+0

我也有一个ID为0的遗留数据集。对于这些情况,我怀疑提问的人具有相同的用例,那么这是正确的答案。 – 2015-08-26 18:04:35

0

如果有一个具有复合AUTO_INCREMENTPRIMARY KEY MyISAM表,并试图键

例如

 
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`); 
0

这是因为你的主键列已经有值组合也会发生这种错误。

由于错误说...

ALTER TABLE导致AUTO_INCREMENT重测序,从而导致重复条目“1”关键“PRIMARY”

这意味着你的专栏已经有一个主键值当你auto_increment该列被重新分配导致重复,因此这个错误

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

8

这发生在MySQL无法确定正确的auto_increment值时。在你的情况下,MySQL选择1作为下一个auto_increment值,但是表中已经有该行的值。解决这个问题

一种方法是选择自己合适的AUTO_INCREMENT值:(注意AUTO_INCREMENT=123456末)

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

+0

正是我需要的。我无法相信这个答案在列表中不会更高。 – 2016-12-30 15:33:58

6

,我已经找到了解决这个问题的最简单方法首先在更改列之前设置表的AUTO INCREMENT值。只要确保您设置的自动递增值高于最大值目前在该列:

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

我测试了在MySQL 5.7,它为我工作很好。

+0

天才,谢谢。会把我的头发拉出来。 – cdonner 2017-04-12 19:19:03

+0

这应该被选为正确的答案,而不是重新创建表的方法! – 2017-11-24 11:09:21