我的数据库中有一个名为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;
但我仍遇到同样的问题。
答案 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
然后运行我的批量插入语句而不会重新排序问题。
然后使用以下步骤恢复主键和原始值:
这是前两个步骤的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`;
现在我已经完全按照需要复制了原始表值。我希望这可以帮助其他人节省时间。