假设我有一个包含id列和其他一些列的表(它们在这里没有任何区别):
+-----+-----+ | id |other| +-----+-----+
id具有数值递增的值。我的目标是获取最低的未使用ID并创建该行。因此,当然,这是我第一次运行,它将返回0,并且该行的行已创建。经过几次执行后,它将如下所示:
0
+-----+-----+ | id |other| +-----+-----+ | 0 | ... | | 1 | ... | | 2 | ... | | 3 | ... | | 4 | ... | +-----+-----+
通常,其中某些行可能会被删除。假设ID为1和的行3已删除。没有表会看起来像这样:
1
3
+-----+-----+ | id |other| +-----+-----+ | 0 | ... | | 2 | ... | | 4 | ... | +-----+-----+
如果我现在再次运行查询,它想找回ID 1,则应创建此行:
| id |other| +-----+-----+ | 0 | ... | | 1 | ... | | 2 | ... | | 4 | ... | +-----+-----+
接下来的时间查询运行时,它应该返回ID的3,5,6,等。
5
6
当我需要在一秒钟内相当频繁地执行它们时,最有效的方法是运行这些查询(假设id是表的唯一目的是公平的)?是否可以通过一个查询获取下一个未使用的行?还是通过引入另一个跟踪未使用的ID的表来更轻松,更快捷地进行操作?
如果要快得多,还可以找到一种方法来重用表中的任何孔,前提是所有数字都可以在某个时间被重用。
额外的问题:我计划使用SQLite进行这种类型的存储信息,因为除了存储这些ID之外,我不需要数据库。是否有任何其他免费的(如语音)服务器,可以做这个工作 显著 更快?
就像丹尼斯·哈布林克Dennis Haarbrink所说的那样;删除时触发,插入时触发:
删除触发器将获取已删除的ID并将其插入ID池表(仅一列id)
id
插入之前的触发器将检查是否提供了id值,否则将仅查询id池表(例如:从id_pool_table中选择MIN(id))并分配它(ig从id_pool_table中删除它)