sql - 如何在 SQLite 中使用序列?

标签 sql sqlite sequence

我正在编写一个基于 PHP 的 Web 应用程序,它应该可以与多个数据库系统一起使用。最重要的是 MySQL 和 SQLite,但 PostgreSQL 和其他的也不错。为此,我尽量使用可移植的 SQL。如果这是不可能的,我在我的查询中定义了一些元词,这些元词由我的数据库层处理并转换为特定于平台的 SQL 命令。

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

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

有人知道用 SQLite 解决这个问题吗?

最佳答案

只需创建一个常规计数器表即可。在创建序列 foo 时,执行

create table foo(value int);
insert into foo(value) values(0);

然后,当询问下一个计数器值时,做

update foo set value=value+1;

虽然这会在事务中止时回滚,但它 是多用户安全的:没有两个用户会提交相同的数字。 sqlite 通过数据库锁实现并发,所以第二个写入者无论如何都会阻塞(不仅仅是因为序列更新,还因为它想要进行的其他更改)。

关于sql - 如何在 SQLite 中使用序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4484984/

相关文章:

mysql - 如何将存储在引用表中的引用值插入到另一个表中?

android - 如何从 SQLite 数据库中检索图像?

sqlite - 列出已加载的 sqlite3 扩展?

Python:检查列表a中的索引是否=输入=列表b中的索引

ios - Swift Dictionary 的自定义序列

SQL 执行计划显示相同输入的不同结果

sql - 三值逻辑上下文中 bool 运算符和比较运算符的语义

python - DB-API SQLite INSERT 语句在 Python 2.7 中抛出 InterfaceError

java - Hibernate - 在 SQLite 数据库中将 UUID 的默认类型从二进制更改为文本

python - 如何在不循环的情况下顺序更新 Numpy 数组