首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >类似串行的整型列

类似串行的整型列
EN

Stack Overflow用户
提问于 2010-08-15 00:43:39
回答 3查看 697关注 0票数 1

我有一个应用程序,根据正在添加或更新的交易类型,票号可能会增加也可能不会增加。我不能对票据编号使用序列数据类型,因为无论事务类型如何,它都会递增,所以我将票据编号定义为INT。因此,在多用户环境中,如果用户A正在添加或更新事务,而用户B也在执行相同的操作,我将测试tran类型,如果需要下一个票证编号,则

代码语言:javascript
复制
LET ticket = (SELECT MAX(ticket) [WITH ADDLOCK or UPDLOCK?] FROM transactions) + 1

但是,必须准确地在提交行或出现问题时执行此操作。你能想出一种更好的方式来实现这一点: Informix,Oracle,MySQL,SQL-Server,4Js/Genero或其他关系型数据库管理系统?这是决定我要用什么RDBMS重写我的应用程序的一个主要因素。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-15 12:29:23

使用Informix DBMS,序列列在插入后不会更改;实际上,您根本不能更新序列值。您可以插入一个值为0的新值-在这种情况下会生成一个新值-也可以插入一些其他值。如果另一个值已经存在,并且存在唯一约束,则将失败;如果该值不存在,或者如果序列列上没有唯一约束,则将成功。如果插入的值大于先前插入的最大值,则下一个要插入的数字将再次大于1。如果插入的数字较小或为负数,则对下一个数字没有影响。

因此,您可以在不更改值的情况下进行更新--没问题。如果需要更改数字,则必须执行delete和insert (或insert和delete),其中insert中包含零。如果您更喜欢一致性并使用事务,则始终可以删除,然后(重新)插入具有相同编号或带有零的行以触发新编号。这里假设您有一种运行SQL的编程语言;我不认为您可以通过调整ISQL和执行来自动执行该操作。

因此,在这一点上,我在Informix上看不到问题。

对于适当版本的IDS (任何支持的版本),您也可以使用SEQUENCE来控制插入的值。这是基于Oracle语法和概念的;DB2也支持这一点。其他DBMS有其他等效(但不同)的机制来处理自动生成的数字。

票数 2
EN

Stack Overflow用户

发布于 2010-08-17 00:14:25

这就是创建序列的目的,也是大多数数据库都支持的(MySQL是唯一一个没有序列的数据库--尽管不是百分之百确定Informix.)

任何依赖于SELECT MAX(id)反模式的算法在多用户环境中要么非常慢,要么在多用户环境中无法正常工作。

如果还需要支持MySQL,我建议在每个数据库中使用“原生”“自动递增”类型( PostgreSQL的serial、MySQL的auto_increment、SQL Server的identity、Oracle中的sequence + trigger等等),并让驱动程序返回生成的ID值

在JDBC中有一个getGeneratedKeys()方法,我相信其他接口也有类似的方法。

票数 2
EN

Stack Overflow用户

发布于 2010-08-15 00:52:05

从你的标签中很难看出你使用的是什么数据库。

对于SQL Server (因为它已列出),我建议

代码语言:javascript
复制
ticket_num = (SELECT MAX(ticket_number) FROM transactions with (updlock)) + 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3484219

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档