【发布时间】:2011-04-03 21:24:19
【问题描述】:
(与Finding the lowest unused unique id in a list和Getting unused unique values on a SQL table有关)
假设我有一个包含 id 列和其他一些列的表(它们在这里没有任何区别):
+-----+-----+
| id |other|
+-----+-----+
id 有数值递增的值。我的目标是获得最低的未使用 id 并创建该行。所以当然我第一次运行它会返回0,并且该行的行将被创建。执行几次后,它将如下所示:
+-----+-----+
| id |other|
+-----+-----+
| 0 | ... |
| 1 | ... |
| 2 | ... |
| 3 | ... |
| 4 | ... |
+-----+-----+
其中一些行经常会被删除。假设删除了 ID 为 1 和 3 的行。没有表格会是这样的:
+-----+-----+
| id |other|
+-----+-----+
| 0 | ... |
| 2 | ... |
| 4 | ... |
+-----+-----+
如果我现在再次运行查询,它想取回 id 1 并且应该创建此行:
| id |other|
+-----+-----+
| 0 | ... |
| 1 | ... |
| 2 | ... |
| 4 | ... |
+-----+-----+
下次运行查询时,它应该返回 id 的 3、5、6 等。
运行这些查询的最有效方法是什么,因为我需要在一秒钟内经常执行它们(假设 id 是表的唯一目的是公平的)?是否可以通过一个查询获得下一个未使用的行?还是通过引入另一个跟踪未使用 id 的表来更轻松、更快捷?
如果它明显更快,也有可能找到一种方法来重用表中的任何孔,前提是所有数字都在某个时间被重用。
额外问题:我计划使用 SQLite 来存储这种信息,因为除了存储这些 id 之外我不需要数据库。是否有任何其他免费(如语音)服务器可以显着更快地完成这项工作?
【问题讨论】:
-
为什么需要重复使用已删除的 ID?
-
这些 id 将显示给用户,然后他们需要做一些使用长 id 会更难的事情(比如通过电话拼写它们)。由于它们的生存时间很短,因此最好重复使用它们以缩短数量。
-
您是否需要担心并发性,或者是一个应用程序/线程在执行插入操作?
-
@Martin Smith:它是一个 Web 应用程序,可以由几个用户(因此不止一个线程)同时访问。
-
@Martin Smith:我希望数据库不会两次创建该行并返回错误,以便我可以重试。
标签: sql scalability execution-time