我正在编写一个基于 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/