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