我正在编写一个基于PHP的Web应用程序,它应该可以与多个数据库系统一起使用。最重要的是MySQL和SQLite,但PostgreSQL和其他人也会很好。为此,我尝试尽可能使用便携式SQL。如果无法做到这一点,我在查询中定义了一些由我的数据库层处理并转换为特定于平台的SQL命令的元词。
我现在正在尝试添加序列支持。每个DBMS处理不同的序列,没有通用的方法在SQL中编写它们。我已阅读并理解PostgreSQL does it的方式。我发现了一个有趣的solution for MySQL,它使用MyISAM表来逃避事务的隔离约束。毕竟,序列不会随着它们使用的事务而回滚,这正是我想要的。序列应该是多用户安全的。
现在我还没有找到SQLite的解决方案。它缺乏内置的序列支持。它没有提供在正在运行的事务之外存储数据的方法。我目前的实现是锁定表足够远,以执行SELECT MAX(...)并使用该值。但我想完全摆脱它。在SQLite中,这种方法需要锁定整个数据库!
有人知道SQLite的解决方案吗?
答案 0 :(得分:4)
只需创建一个常规计数器表。在创建序列foo
时,请执行
create table foo(value int);
insert into foo(value) values(0);
然后,当要求下一个计数器值时,请执行
update foo set value=value+1;
当事务中止时会回滚,但 多用户安全:没有两个用户会提交相同的号码。 sqlite使用数据库锁实现并发,因此第二个编写器无论如何都会阻塞(不仅仅是因为序列更新,还因为它想要进行其他更改)。
答案 1 :(得分:3)
我会使用lastInsertRowID。这将返回最后插入数据的rowid(等于该行的INTEGER PRIMARY KEY值)。 那时你不需要任何顺序。