我有一个表“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
有人有个主意吗?
如果表包含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找到。
我在尝试将列转换为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的完整详细信息。
当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
。)
编辑:不知道究竟是怎么造成的,但我确实有一个解决方法。
首先,创建一个像旧的表一样的新表:
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。:作为荷兰人,我强烈建议用英文编码;)
我找到解决此问题的最简单方法是在更改列之前首先设置表的AUTO INCREMENT
值。只需确保将自动增量值设置为高于该列中当前的最大值:
ALTER TABLE `aafest`.`aafest_bestelling`
AUTO_INCREMENT = 100,
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT
我在MySQL 5.7上测试了这个,它对我很有用。
发生这种情况是因为您的主键列已有值。
正如错误所说......
ALTER TABLE导致auto_increment重新排序,导致键'PRIMARY'重复输入'1'
这意味着您的列已经具有主键值1,当您auto_increment重新分配该列时会导致重复,从而导致此错误
解决方案是删除主要约束,然后清空列。然后再次更改表设置主键,这次使用自动增量。
我有一个类似的问题。问题是该表与ID = 0
的记录类似于SystemParadox所指出的。我通过以下步骤处理了我的问题:
脚步:
x
,其中x = MAX(id)+1
x+1
x
更改回0
代码示例:
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;
如果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`);
如果该表是相对较新的,只有几条记录,您可以截断表以重置ID值:
TRUNCATE TABLE tablename;
使用Delete不会重置ID值。
DELETE FROM tablename;
在表清空后,您可以应用自动增量。
CHANGE COLUMN `Id` `Id` INT(11) NOT NULL AUTO_INCREMENT