加入收藏 | 设为首页 | 会员中心 | 我要投稿 海南站长网 (https://www.0898zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

如何在SQLite中使用序列?

发布时间:2022-11-16 20:32:40 所属栏目:MsSql教程 来源:转载
导读: 如何在SQLite中使用序列?
sqlsqlite
如何在SQLite中使用序列?,sql,sqlite,sequence,Sql,Sqlite,Sequence,我正在编写一个基于PHP的web应用程序,它可以与多个数据库系统一起工作。最重要的

如何在SQLite中使用序列?

sqlsqlite

如何在SQLite中使用序列?,sql,sqlite,sequence,Sql,Sqlite,Sequence,我正在编写一个基于PHP的web应用程序,它可以与多个数据库系统一起工作。最重要的是MySQL和SQLite,但PostgreSQL和其他也不错。为此,我尽量使用可移植的SQL。在不可能的情况下,我在查询中定义了一些元词,这些元词由数据库层处理mssql 使用序列,并转换为特定于平台的SQL命令我现在尝试添加序列支持。每个DBMS处理序列的方式都不同,没有通用的SQL编写方法。我已经阅读并理解了这条路。我发现了一个有趣的方法,它使用MyISAM表来逃避事务的隔离约束。毕竟,序列不会随它们所使用的事务一起回滚,这正

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

我现在尝试添加序列支持。每个DBMS处理序列的方式都不同,没有通用的SQL编写方法。我已经阅读并理解了这条路。我发现了一个有趣的方法,它使用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使用数据库锁实现并发,因此第二个编写器无论如何都会阻塞(不仅因为序列更新,还因为它要进行的其他更改)。

我将使用lastInsertRowID。这将返回最后插入的数据的rowid(等于该行的整数主键值)。那么您就不需要任何序列了。

为什么不使用现有的多数据库层(如PEAR db())而不是编写自己的数据库层呢?因为my db层执行更多特定于应用程序的转换和检查工作。它使用PDO作为下一层,因此PHP已经提供了最多的多DBMS逻辑。我的数据库类是应用程序对象和PDO之间的唯一层。使用MDB2,我将在用户代码中增加一层。对于我的案例,MDB2似乎并不比PDO好多少。虽然我可以做到这一点,但它的概念与序列大不相同。我希望将DBMS之间的差异保持在最小程度,因此最好模拟传统的序列。我发现,即使是长期规划的DBMS,也没有一半支持真实序列。(PostgreSQL和Oracledo.MySQL、SQLite和MSSQL不支持)所以我改变了我的数据库层,以透明的方式处理自动递增列,并在支持它们的系统上为它们使用序列值。在没有使用序列值而插入NULL的情况下,我获取查询后最后插入的值。在SQL语句之后知道新的ID值就足够了。如果您计划以任何实际方式使用该ID,这不会影响您的逻辑吗?因为一旦您删除行,该ID将变得无效?最好为行id和逻辑实体(如产品id)分别设置一个序列值,然后按照@Martin v的建议构建计数器表。L?wisI对此解决方案有问题。当一个客户端启动事务并更新该值时,另一个客户端启动事务并希望更新该值,第二个客户端无法更新,但保留该事务。只要第二个客户端不回滚,第一个客户端就无法提交,也只能回滚,因此两个客户端最终都失败了,导致两个愤怒的用户,而实际上根本没有。我只能为sequence的东西启动独占事务,将数据库锁定在其他任何东西上。虽然这是真的,但我认为它适用于对数据库的所有修改:sqlite锁总是在数据库级别上。假设增加计数器的事务也会进行其他更改,无论如何,您需要一个独占锁。

(编辑:海南站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!