我有一个应用程序,根据正在添加或更新的事务类型,票号可能会增加,也可能不会增加。我不能对票证号使用串行数据类型,因为不管事务类型如何,它都会增加,所以我将票证号定义为in t。因此,在多用户环境中,如果用户a正在添加或更新事务,而用户b也在执行相同的操作,则测试事务类型,如果需要下一个票证号,则
LET ticket = (SELECT MAX(ticket) [WITH ADDLOCK or UPDLOCK?] FROM transactions) + 1
然而,这必须在争吵发生或麻烦开始的时候进行。你能想出一个更好的方法来实现这一点吗:informix、oracle、mysql、sql server、4js/gloo或其他rdbms?这是一个主要因素,它将决定我将在什么关系数据库中重新编写我的应用程序。
最佳答案
使用informix dbms,插入serial列后它不会改变;实际上,您根本不能更新serial值。可以插入一个值为0的新值(在这种情况下会生成一个新值),也可以插入其他值。如果另一个值已经存在并且存在一个唯一的约束,那么它将失败;如果它不存在,或者如果没有对串行列的唯一约束,那么它将成功。如果插入的值大于先前插入的最大值,则下一个要插入的数字将再次变大。如果插入的数字较小或为负数,则对下一个数字没有影响。
所以,您可以在不更改值的情况下进行更新-没问题。如果需要更改号码,则必须执行“删除并插入”(或“插入并删除”),其中插入的数字为零。如果您喜欢一致性,并且使用事务,则可以始终删除,然后(重新)插入具有相同数字或零的行以触发新数字。这假设您有一个运行sql的编程语言;我认为您不能调整isql并自动执行。
所以,在这一点上,我不认为informix有问题。
使用适当版本的id(任何受支持的内容),您也可以使用sequence来控制插入的值。这是基于Oracle语法和概念的;DB2也支持这一点。其他dbms还有其他处理自动生成的数字的等效(但不同)机制。
关于mysql - SERIAL INT列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3484219/