在缺少值的列上设置AUTO_INCREMENT

时间:2017-04-08 08:25:42

标签: mysql database

我的数据库中有一个名为users的表。它的字段id的类型为int。截至目前,对于每个注册用户,由于删除的用户帐户而丢失了一些中间值,因此手动递增。我无法更改其他注册用户的用户ID。我尝试使用此声明将此列更改为AUTO_INCREMENT

ALTER TABLE `userinfo` CHANGE `id` `id` BIGINT(20) NOT NULL AUTO_INCREMENT;

但我收到以下错误

  

1062 - ALTER TABLE导致auto_increment重新排序,导致   重复输入' 1'关键' PRIMARY'

我桌上只有大约200个用户。所以我想从201开始执行AUTO_INCREMENT。我执行了以下语句

ALTER TABLE `userinfo` AUTO_INCREMENT=201;
ALTER TABLE `userinfo` CHANGE `id` `id` INT(10) NOT NULL AUTO_INCREMENT;

但我仍遇到同样的问题。

4 个答案:

答案 0 :(得分:2)

如果您没有重复项(id),那么您应该没有问题:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.17    |
+-----------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `userinfo`;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE IF NOT EXISTS `userinfo` (
    ->   `id` INT(11) NOT NULL
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `userinfo`
    ->   (`id`)
    -> VALUES
    ->   (1),
    ->   (2),
    ->   (3),
    ->   -- (1),
    ->   (10),
    ->   (11),
    ->   (15),
    ->   (20),
    ->   (182),
    ->   (191);
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE `userinfo`
    ->   CHANGE `id` `id` BIGINT(20) NOT NULL
    ->   PRIMARY KEY AUTO_INCREMENT;
Query OK, 9 rows affected (0.00 sec)
Records: 9  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE `userinfo` AUTO_INCREMENT = 201;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> SHOW CREATE TABLE `userinfo`\G
*************************** 1. row ***************************
       Table: userinfo
Create Table: CREATE TABLE `userinfo` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=201 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

在另一个案例中:

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.17    |
+-----------+
1 row in set (0.00 sec)

mysql> DROP TABLE IF EXISTS `userinfo`;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE TABLE IF NOT EXISTS `userinfo` (
    ->   `id` INT(11) NOT NULL
    -> );
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO `userinfo`
    ->   (`id`)
    -> VALUES
    ->   (1),
    ->   (2),
    ->   (3),
    ->   (1), -- Duplicate
    ->   (10),
    ->   (11),
    ->   (15),
    ->   (20),
    ->   (182),
    ->   (191);
Query OK, 10 rows affected (0.00 sec)
Records: 10  Duplicates: 0  Warnings: 0

mysql> ALTER TABLE `userinfo`
    ->   CHANGE `id` `id` BIGINT(20) NOT NULL
    ->   PRIMARY KEY AUTO_INCREMENT;
ERROR 1062 (23000): ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry '1' for key 'PRIMARY'

答案 1 :(得分:1)

尝试将列重置为主键,如下所示:

ALTER TABLE `userinfo` CHANGE `id` `id` INT(10) PRIMARY KEY AUTO_INCREMENT;

答案 2 :(得分:1)

你可以放弃auto_increment然后设置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;

答案 3 :(得分:0)

我遇到同样的问题/错误(MySql 5.7.28),因为批量插入的数据缺少主键/ auto_increment值-即使没有重复。我想保留主键,并且还需要保留原始字段值,因为重新排序会导致系统中的数据完整性问题。

我的解决方案是按照上面的建议删除auto_increment,然后删除主键:

pd.DataFrame(np.array(My_lst).reshape((-1,3)),columns=['name','title','company'])
    name   title   company
0  Name1  Title1  Company1
1  Name2  Title2  Company2
2  Name3  Title3  Company3
3  Name4  Title4  Company4
4  Name5  Title5  Company5
5  Name6  Title6  Company6

然后运行我的批量插入语句而不会重新排序问题。

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

  1. 重新命名原始的PK /自动递增字段,现在该字段中具有所需的值
  2. 使用原始字段名称创建新的PK /自动递增字段
  3. 将自动递增值设置为比重命名字段的最大值大一的值
  4. 将原始值复制到新的PK /自动增量字段中
  5. 删除重命名的字段(现在您具有带有PK / auto-increment字段的原始模式,并根据需要在序列中具有原始间隔。

这是前两个步骤的sql:

ALTER TABLE `userinfo` CHANGE `id` `id` int NOT NULL;
ALTER TABLE `userinfo` DROP PRIMARY KEY;

然后使用以下查询结果:

ALTER TABLE `userinfo` CHANGE `id` `orig_id` INT;
ALTER TAble `userinfo` add id int auto_increment not null primary key;

在设置新的PK /自动增量值之前设置新的自动增量:

select max(orig_id) + 1 from `userinfo`;

现在我已经完全按照需要复制了原始表值。我希望这可以帮助其他人节省时间。

相关问题