如何在sqlite中对所有表使用一个序列

How to use one sequence for all table in sqlite

提问人:Bishan 提问时间:2/27/2013 最后编辑:ElementWBishan 更新时间:10/25/2015 访问量:10811

问:

当我在 SQLite 数据库中创建表时,会自动为每个表创建单独的序列。

但是,我想对 SQLite 数据库中的所有表使用一个序列,并且还需要设置和值(例如 和 ) ( 和 表示序列的起始值和该序列可以递增的最大值)。minmaxmin=10000max=999999minmax

我知道这可以在 Oracle 数据库中完成,但不知道如何在 SQLite 中完成。

有什么办法可以做到这一点吗?

SQLite 序列

评论

1赞 Bishan 2/27/2013
@muistooshort我使用.对于我的数据库中的所有表,表中都有单独的不同序列。SQLite Database Browsersqlite_sequence

答:

6赞 mvp 2/27/2013 #1

不幸的是,你不能这样做:SQLite会自动为特殊服务表中的每个表创建序列。sqlite_sequence

即使你以某种方式强制它采用单个序列作为所有表的源,它也不会按照你期望的方式工作。例如,在 PostgreSQL 或 Oracle 中,如果将 sequence 设置为值,例如,但表已经用值填充了行,,...,则使用该序列作为源插入新行的任何尝试都将失败,并出现唯一约束冲突。112

但是,在SQLite中,如果您使用以下命令手动重置序列:

UPDATE sqlite_sequence SET seq = 1 WHERE name = 'mytable'

并且您已经有行,,,...,新的插入尝试不会失败,但会自动为适当的自动增量列分配此序列的最大现有值,以便它可以继续上升。123

请注意,您可以使用此 hack 为序列分配起始值,但您不能让它在某个值处停止递增(除非您使用其他方式观看它)。

评论

0赞 RobMcZag 1/23/2016
如果列使用自动递增,则不会发生重复,因为下次您将使用该序列时,SQLite 将生成一个数字,该数字是表中的最大值 + 1。我不确定这是否只发生在主键或具有唯一约束的列上,但自动递增列通常是这种情况。
0赞 mvp 1/23/2016
@RobMcZag:这正是我所说的 - 在SQLite中,如果表中已经存在当前值,则序列将自动分配下一个可能的值。当前算法为 max+1
0赞 RobMcZag 1/26/2016
是的,但试图概括。在示例中,您将序列设置为 1,但行中有 id=1。我试图指出,在SQLite中,无论如何你都会得到max+1,即使你将序列设置为表中不的数字,所以人们可以认为是可用的。
1赞 florisla 8/28/2015 #2

首先,这是一个坏主意。

数据库查询的性能取决于可预测性,并且通过调整索引序列,您将引入偏移量,这将使数据库引擎感到困惑。

但是,要实现此目的,您可以尝试确定高于或等于任何现有序列号的最小序列号:

SELECT MAX(seq) FROM sqlite_sequence

这需要在每次 INSERT 查询之后完成,然后更新所有表的所有序列:

UPDATE sqlite_sequence SET seq=determined_max