如何在SQLite中使用序列?

ygo*_*goe 7 sql sqlite sequence

我正在编写一个基于PHP的Web应用程序,它应该可以与多个数据库系统一起使用.最重要的是MySQL和SQLite,但PostgreSQL和其他人也会很好.为此,我尝试尽可能使用便携式SQL.如果无法做到这一点,我在查询中定义了一些由我的数据库层处理并转换为特定于平台的SQL命令的元词.

我现在正在尝试添加序列支持.每个DBMS处理不同的序列,没有通用的方法在SQL中编写它们.我已阅读并了解PostgreSQL的工作方式.我找到了一个有趣的MySQL解决方案,它使用MyISAM表来逃避事务的隔离约束.毕竟,序列不会随着它们使用的事务而回滚,这正是我想要的.序列应该是多用户安全的.

现在我还没有找到SQLite的解决方案.它缺乏内置的序列支持.它没有提供在正在运行的事务之外存储数据的方法.我目前的实现是锁定表足够远,以执行SELECT MAX(...)并使用该值.但我想完全摆脱它.在SQLite中,这种方法需要锁定整个数据库!

有没有人知道SQLite的解决方案?

UrO*_*Oni 3

我会使用lastInsertRowID。这将返回最后插入数据的 rowid(等于该行的 INTEGER PRIMARY KEY 值)。那么你就不需要任何序列了。

  • 我发现长期规划的 DBMS 中连一半都不支持真实序列。(PostgreSQL 和 Oracle 可以。MySQL、SQLite 和 MSSQL 则不然。)因此,我正在更改数据库层以透明地处理自动增量列,并在支持它们的系统上使用它们的序列值。如果没有使用序列值并且插入了 NULL,我会在查询后获取最后插入的值。在 SQL 语句之后知道新的 ID 值就足够了。 (2认同)