提问人:Bishan 提问时间:2/27/2013 最后编辑:ElementWBishan 更新时间:10/25/2015 访问量:10811
如何在sqlite中对所有表使用一个序列
How to use one sequence for all table in sqlite
问:
当我在 SQLite 数据库中创建表时,会自动为每个表创建单独的序列。
但是,我想对 SQLite 数据库中的所有表使用一个序列,并且还需要设置和值(例如 和 ) ( 和 表示序列的起始值和该序列可以递增的最大值)。min
max
min=10000
max=999999
min
max
我知道这可以在 Oracle 数据库中完成,但不知道如何在 SQLite 中完成。
有什么办法可以做到这一点吗?
答:
不幸的是,你不能这样做:SQLite会自动为特殊服务表中的每个表创建序列。sqlite_sequence
即使你以某种方式强制它采用单个序列作为所有表的源,它也不会按照你期望的方式工作。例如,在 PostgreSQL 或 Oracle 中,如果将 sequence 设置为值,例如,但表已经用值填充了行,,...,则使用该序列作为源插入新行的任何尝试都将失败,并出现唯一约束冲突。1
1
2
但是,在SQLite中,如果您使用以下命令手动重置序列:
UPDATE sqlite_sequence SET seq = 1 WHERE name = 'mytable'
并且您已经有行,,,...,新的插入尝试不会失败,但会自动为适当的自动增量列分配此序列的最大现有值,以便它可以继续上升。1
2
3
请注意,您可以使用此 hack 为序列分配起始值,但您不能让它在某个值处停止递增(除非您使用其他方式观看它)。
评论
首先,这是一个坏主意。
数据库查询的性能取决于可预测性,并且通过调整索引序列,您将引入偏移量,这将使数据库引擎感到困惑。
但是,要实现此目的,您可以尝试确定高于或等于任何现有序列号的最小序列号:
SELECT MAX(seq) FROM sqlite_sequence
这需要在每次 INSERT 查询之后完成,然后更新所有表的所有序列:
UPDATE sqlite_sequence SET seq=determined_max
上一个:从行创建序列概述
评论
SQLite Database Browser
sqlite_sequence