【问题标题】:Derby DB increment the ID even after The statement has been rolled back即使在语句回滚之后,Derby DB 也会增加 ID
【发布时间】:2020-01-12 07:18:00
【问题描述】:

假设我的发票表中只有一条记录。

在我的发票表中插入新行时,如果出现错误,我会收到以下消息:“语句已回滚”。

现在如果我插入一张新发票,我在发票表中得到的 id 是 id=3 的 id=2。

这是我的发票表 DDL:

CREATE TABLE "APP"."INVOICES" ("ID" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1), "INVOICEDATE" DATE NOT NULL, "ISCASHINVOICE" BOOLEAN NOT NULL, "CUSTOMERID" INTEGER, "DISCOUNT" DECIMAL(12,2), "ADDITIONALCHARGE" DECIMAL(12,2), "ADDITIONALTVACHARGE" DECIMAL(12,2),"GARANTIEID" INTEGER,"INVOICETOTAL" DECIMAL(12,2),"TYPEPAYEID" INTEGER , "ISPAYEINVOICE" BOOLEAN NOT NULL DEFAULT FALSE);    

如何解决这个问题发票ID应该正常自动递增。

我确实添加了这个:

System.setProperty("derby.language.sequence.preallocator", "1");    

问题依然存在

【问题讨论】:

  • 为什么要关心id是3还是2?这是一个系统生成的数字,它很容易是 47109 或 85852。你能解释一下为什么这会给你带来问题吗?如果您需要找出数字是多少,在插入新行之后,请使用此处描述的 JDBC 功能:stackoverflow.com/questions/1915166/…
  • 我想要一个连续的发票 ID,没有间隙,这就是为什么。
  • 这是一个有问题的设计目标有很多原因(仅举一个例子,如果你删除一行会发生什么?你会重新编号所有其他行吗?)。但如果这真的是您想要的,您可以尝试使用select max(id) from invoices(在事务中),然后将该数字加 1,然后插入该值。例如。 stackoverflow.com/a/13282214
  • 我会阻止用户删除发票。

标签: java sql derby


【解决方案1】:

Derby 非常适合测试,但我建议您不要在它的错误上花费太多时间。

“不要在生产环境中使用 Derby”可在多个论坛和文档中找到。

【讨论】:

  • 在论坛中搜索有关此数据库的内容有所了解。谢谢!
  • 请为答案投票,以便我可以用图片发布问题:3
  • 我只是按照你的要求做了
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-12
  • 2020-12-31
  • 2018-08-08
  • 1970-01-01
  • 2017-10-01
  • 2011-07-16
  • 2021-07-06
相关资源
最近更新 更多