Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 在缺少值的列上设置自动增量_Mysql_Database - Fatal编程技术网

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语句,无需重新排序问题

然后使用以下步骤还原主键和原始值:

  • 重命名原来的PK/自动增量字段,该字段现在包含所需的值
  • 使用原始字段名创建新的主键/自动递增字段
  • 将自动增量值设置为比重命名字段的最大值多一个
  • 将原始值复制到新的主键/自动增量字段
  • 删除重命名的字段(现在您有了原始模式和PK/auto-increment字段,并根据需要在序列中保留原始间隙)
  • 以下是前两个步骤的sql:

    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),就不会有问题”的说法。