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

时间:2013-02-27 05:36:02

标签: sqlite sequence

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

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

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

有没有办法做到这一点?

2 个答案:

答案 0 :(得分:5)

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

即使你以某种方式强迫它将单个序列作为所有表的源,它也不会按照你期望的方式工作。例如,在PostgreSQL或Oracle中,如果将序列设置为值1,但表已经填充了值为12,...的行,则任何插入新行的尝试使用该序列作为源会因唯一约束违规而失败。

但是,在SQLite中,如果使用以下内容手动重置序列:

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

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

请注意,您可以使用此hack为序列指定起始值,但是您不能使其停止递增某个值(除非您使用其他方法观察它)。

答案 1 :(得分:0)

首先,这是一个坏主意。

数据库查询的性能取决于可预测性,并且通过摆弄索引序列,您将引入会使数据库引擎混淆的偏移量。

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

SELECT MAX(seq) FROM sqlite_sequence

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

UPDATE sqlite_sequence SET seq=determined_max