当我在SQLite数据库中创建表时,会自动为每个表创建单独的序列。
但是我想在我的SQLite数据库中为所有表使用一个序列,还需要设置min
和max
值(例如min=10000
和max=999999
) sequence(min
和max
表示序列的起始值和序列可以递增的最大值。
我知道这可以在Oracle数据库中完成,但不知道如何在SQLite中完成。
有没有办法做到这一点?
答案 0 :(得分:5)
不幸的是,您不能这样做:SQLite会自动为特殊sqlite_sequence
服务表中的每个表创建序列。
即使你以某种方式强迫它将单个序列作为所有表的源,它也不会按照你期望的方式工作。例如,在PostgreSQL或Oracle中,如果将序列设置为值1
,但表已经填充了值为1
,2
,...的行,则任何插入新行的尝试使用该序列作为源会因唯一约束违规而失败。
但是,在SQLite中,如果使用以下内容手动重置序列:
UPDATE sqlite_sequence SET seq = 1 WHERE name = 'mytable'
并且您已经拥有行1
,2
,3
,...,新的插入尝试不会失败,但会自动为此序列分配最大现有值以适当自动增量列,所以它可以继续上升。
请注意,您可以使用此hack为序列指定起始值,但是您不能使其停止递增某个值(除非您使用其他方法观察它)。
答案 1 :(得分:0)
首先,这是一个坏主意。
数据库查询的性能取决于可预测性,并且通过摆弄索引序列,您将引入会使数据库引擎混淆的偏移量。
但是,要实现此目的,您可以尝试确定最低序列号,该序列号高于或等于任何现有序列号:
SELECT MAX(seq) FROM sqlite_sequence
这需要在每次INSERT查询之后完成,然后更新所有表的所有序列:
UPDATE sqlite_sequence SET seq=determined_max