如何在MySQL表中插入值时覆盖自动递增主键的属性?

mac*_*mac 28 mysql

我有一个MySQL用户表,其主键是一个自动递增的整数.该表已填充了密钥介于0到30.000之间的记录.不过,并非所有记录都在那里.一些用户已被删除,因此我有"漏洞".

现在,客户已经意识到他们错误地删除了一堆用户,现在他们希望我重新插入那些保持相同ID的用户,以便与电子商务的后端兼容,后者在不同的机器上运行,但为客户使用相同的ID.

目前我是:

  1. 通过从ID中删除auto_increment属性来更改表的结构
  2. 添加我需要的记录,指定他们的ID
  3. 恢复表格结构的改动.

有没有更好的方法来实现这一目标?是否有任何SQL override函数允许我强制MySQL接受一个唯一但不一定是"行中的下一个数字"的值?

Dan*_*oap 26

您不必禁用该auto_increment功能.向表中插入行并指定行中的主键值时,所需的ID将存储在数据库中.在auto_increment仅使用,当你忽略了主键字段.

编辑:我想我可能会举例说明:

mysql> describe test;
+-------+------------------+------+-----+---------+----------------+
| Field | Type             | Null | Key | Default | Extra          |
+-------+------------------+------+-----+---------+----------------+
| id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| value | varchar(45)      | NO   |     | NULL    |                |
+-------+------------------+------+-----+---------+----------------+
2 rows in set (0.02 sec)

mysql> insert into test (value) values ('row 1');
Query OK, 1 row affected (0.06 sec)

mysql> select * from test;
+----+-------+
| id | value |
+----+-------+
|  1 | row 1 |
+----+-------+
1 row in set (0.00 sec)

mysql> insert into test values (15, 'row 2');
Query OK, 1 row affected (0.03 sec)

mysql> select * from test;
+----+-------+
| id | value |
+----+-------+
|  1 | row 1 |
| 15 | row 2 |
+----+-------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

编辑2

mysql> insert into test (id, value) values (3, 'row 3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from test;
+----+-------+
| id | value |
+----+-------+
|  1 | row 1 |
| 15 | row 2 |
|  3 | row 3 |
+----+-------+
3 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)

  • 刚刚意识到这只有在你手动设置一个大于表中已经存在的最大"id"的"id"时才有效.如果您尝试分配表中不存在但低于已插入的最大值的"id",则该方法失败: - / (9认同)
  • @mac - 这也适用于较低的ID.请参阅上面的更改 (2认同)
  • 如果您尝试在auto-inc字段中插入零“ 0”,则mysql(至少我在5.7.19上尝试过的一个实例)认为未设置该值,而是使用auto-inc。 (2认同)