首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在MySQL表中插入值时,如何覆盖自动递增主键的属性?

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

Stack Overflow用户
提问于 2009-12-11 06:01:37
回答 4查看 28.3K关注 0票数 33

我有一个用户的MySQL表,它的主键是一个自动递增的整数。表中已经填充了键值在0到30.000之间的记录。然而,并不是所有的记录都在那里。一些用户已经被删除,因此我有“漏洞”。

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

目前我是:

  1. 更改表的结构,方法是从ID中删除auto_increment属性
  2. 添加我需要的记录,指定它们的ID
  3. 恢复对表结构的更改。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-12-11 06:05:05

您不必禁用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)

编辑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)
票数 34
EN

Stack Overflow用户

发布于 2014-01-11 11:04:05

我也遇到过类似的问题。我发现可以在update中将ID设置为任何数字,但在insert中不能将其设置为低于当前最小值。为了解决这个问题,我编写了一个脚本,将导入数据转换为一系列SQL语句,每行数据对应的语句对如下所示:

// This inserts the record with the next auto_increment id<br />
INSERT INTO mytable (ID, NAME, OTHER_COL...) VALUES (17, 'UNIQUE VALUE', 'other value'...);<br />
// This sets the correct ID on the newly inserted record<br />
UPDATE mytable SET ID=17 WHERE NAME='UNIQUE VALUE';

如果没有唯一的字段,那么可以编写一个SQL来获取最大的ID,并在插入下一条记录之前将其更新为正确的ID。我希望这能帮到你!

票数 3
EN

Stack Overflow用户

发布于 2009-12-11 06:17:55

为了避免在实现AUTO_INCREMENT (或任何数据库中的标识字段)时出现问题,我从不在数据库之外的人员(个人或系统)必须知道这些值时使用它。

MySQL documentation说:

AUTO_INCREMENT属性可用于为新行生成唯一标识。

在我看来,这就是你应该关心的。数字就在那里,它们是独一无二的。不管它们是什么,不管它们有没有“缝隙”或“洞”。如果您想要外部可见的ID,也许某种GUID会更好。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1884387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档