我有一个用户的MySQL表,它的主键是一个自动递增的整数。表中已经填充了键值在0到30.000之间的记录。然而,并不是所有的记录都在那里。一些用户已经被删除,因此我有“漏洞”。
现在客户已经意识到他们错误地删除了一堆用户,他们现在希望我重新插入那些保留相同ID的用户,以便与电子商务的后端兼容,电子商务在完全不同的机器上运行,但对客户使用相同的ID。
目前我是:
有没有更好的方法来实现这一点?是否有任何SQL override
函数允许我强制MySQL接受唯一但不一定是“行中的下一个数字”的值?
发布于 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)
发布于 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。我希望这能帮到你!
发布于 2009-12-11 06:17:55
为了避免在实现AUTO_INCREMENT (或任何数据库中的标识字段)时出现问题,我从不在数据库之外的人员(个人或系统)必须知道这些值时使用它。
AUTO_INCREMENT属性可用于为新行生成唯一标识。
在我看来,这就是你应该关心的。数字就在那里,它们是独一无二的。不管它们是什么,不管它们有没有“缝隙”或“洞”。如果您想要外部可见的ID,也许某种GUID会更好。
https://stackoverflow.com/questions/1884387
复制相似问题