Mysql 在缺少值的列上设置自动增量
我的数据库中有一个名为Mysql 在缺少值的列上设置自动增量,mysql,database,Mysql,Database,我的数据库中有一个名为users的表。它有一个类型为int的字段id。到目前为止,对于每个注册的用户,这是手动递增的,由于删除了用户帐户,因此缺少一些中间值。我无法更改其他注册用户的用户id。我试图使用此语句将此列更改为AUTO_INCREMENT ALTER TABLE `userinfo` CHANGE `id` `id` BIGINT(20) NOT NULL AUTO_INCREMENT; 但是我犯了以下错误 1062-ALTER TABLE导致自动增量重新排序,导致 键“PRIMAR
users
的表。它有一个类型为int
的字段id
。到目前为止,对于每个注册的用户,这是手动递增的,由于删除了用户帐户,因此缺少一些中间值。我无法更改其他注册用户的用户id。我试图使用此语句将此列更改为AUTO_INCREMENT
ALTER TABLE `userinfo` CHANGE `id` `id` BIGINT(20) NOT NULL AUTO_INCREMENT;
但是我犯了以下错误
1062-ALTER TABLE导致自动增量重新排序,导致
键“PRIMARY”的重复条目“1”
我的表中只有大约200个用户。所以我想从201开始自动递增。我执行了以下声明
ALTER TABLE `userinfo` AUTO_INCREMENT=201;
ALTER TABLE `userinfo` CHANGE `id` `id` INT(10) NOT NULL AUTO_INCREMENT;
但我还是遇到了同样的问题。尝试将列重置为主键,如下所示:
ALTER TABLE `userinfo` CHANGE `id` `id` INT(10) PRIMARY KEY AUTO_INCREMENT;
您只需删除自动增量,然后设置自动增量,无需重新创建主键
ALTER TABLE `userinfo` CHANGE `id` `id` int NOT NULL;
ALTER TABLE `userinfo` AUTO_INCREMENT=9;
ALTER TABLE `userinfo` CHANGE `id` `id` int NOT NULL AUTO_INCREMENT;
如果没有重复项(
id
),则不会出现以下问题:
mysql>选择版本();
+-----------+
|版本(|
+-----------+
| 5.7.17 |
+-----------+
一行一组(0.00秒)
mysql>删除表(如果存在)`userinfo`;
查询正常,0行受影响(0.01秒)
mysql>创建表(如果不存在)`userinfo`(
->`id`INT(11)不为空
-> );
查询正常,0行受影响(0.00秒)
mysql>插入到'userinfo'中`
->(`id`)
->价值观
-> (1),
-> (2),
-> (3),
-> -- (1),
-> (10),
-> (11),
-> (15),
-> (20),
-> (182),
-> (191);
查询正常,9行受影响(0.00秒)
记录:9个重复:0警告:0
mysql>altertable`userinfo`
->更改`id``id`BIGINT(20)不为空
->主键自动递增;
查询正常,9行受影响(0.00秒)
记录:9个重复:0警告:0
mysql>ALTER TABLE`userinfo`AUTO_INCREMENT=201;
查询正常,0行受影响(0.00秒)
记录:0个重复:0个警告:0
mysql>显示创建表`userinfo`\G
*************************** 1. 划船***************************
表:用户信息
创建表:创建表“userinfo”(
`id`bigint(20)非空自动增量,
主键(`id`)
)ENGINE=InnoDB AUTO_INCREMENT=201默认字符集=utf8mb4
一行一组(0.00秒)
在另一种情况下:
mysql>选择版本();
+-----------+
|版本(|
+-----------+
| 5.7.17 |
+-----------+
一行一组(0.00秒)
mysql>删除表(如果存在)`userinfo`;
查询正常,0行受影响(0.01秒)
mysql>创建表(如果不存在)`userinfo`(
->`id`INT(11)不为空
-> );
查询正常,0行受影响(0.00秒)
mysql>插入到'userinfo'中`
->(`id`)
->价值观
-> (1),
-> (2),
-> (3),
->(一)重复
-> (10),
-> (11),
-> (15),
-> (20),
-> (182),
-> (191);
查询正常,受影响的10行(0.00秒)
记录:10个重复:0警告:0
mysql>altertable`userinfo`
->更改`id``id`BIGINT(20)不为空
->主键自动递增;
错误1062(23000):ALTER TABLE导致自动增量重新排序,导致键“PRIMARY”的重复条目“1”
我遇到了同样的问题/错误(MySql 5.7.28),大量插入缺少主键/自动增量值的数据-即使没有重复的数据。我想保留主键,还需要保留原始字段值,因为重新排序会导致系统中的数据完整性问题
我的解决方案是删除自动增量,然后删除上面建议的主键:
ALTER TABLE `userinfo` CHANGE `id` `id` int NOT NULL;
ALTER TABLE `userinfo` DROP PRIMARY KEY;
然后运行我的大容量insert语句,无需重新排序问题
然后使用以下步骤还原主键和原始值:
ALTER TABLE `userinfo` CHANGE `id` `orig_id` INT;
ALTER TAble `userinfo` add id int auto_increment not null primary key;
然后使用以下查询结果:
select max(orig_id) + 1 from `userinfo`;
要设置新的自动增量,请在更新新的主键/自动增量值之前:
ALTER TABLE `userinfo` AUTO_INCREMENT=201;
UPDATE `userinfo` set id = orig_id;
ALTER TABLE `userinfo` drop column orig_id;
现在,我已经完全按照需要复制了原始表值。我希望这有助于其他人节省时间。请在table@Barmar如果在我尝试过的列中没有缺少值,那么您所指的问题的答案是有效的,但它不起作用。我得到了相同的错误。@RaminDarvishov The last id为191,请查看您的
userinfo
表中是否有重复的id
。根据我的经验,这是错误的(mysql 5.7.28)如果insert是大容量insert语句,则当插入的值中存在间隙时,重新排序失败-不确定架构的其余部分是否更复杂是否重要,但我的经验似乎与此示例相反。我认为我已经找到了解决方案,但请参阅我的答案。@user6096790:我不完全理解您提到的问题。S请参阅一个可能有用的完整示例。在我的示例中,我尝试从主键字段缺少顺序值的表导入mysqldump数据。导入失败,出现上述错误,当然,即使源主键字段中没有重复项。因此,您的示例不适合我作为resequen的经验即使在没有重复值的情况下,也会发生错误。基本上,我的经验不符合您所说的“如果没有重复项(id),就不会有问题”的说法。