SQL 数字列禁止间隙

SQL Numeric Column forbid Gaps

我正在我的数据库中处理发票 table。我需要一个整数列来存储发票号。此列必须禁止数字之间的差距。标识不起作用,因为回滚会产生间隙。

所以我想要的是:

InvoiceId(Primary key identity)     InvoiceNumber(Unique, NOT NUll)
      1                                      1
      2                                      2
      10                                     3
      13                                     4

sql 中是否有特殊的方法来做到这一点? sql没有解决办法,c#+entity怎么办?

编辑 1: 附加信息:永远不会删除一行。

编辑 2: 为什么我需要 gapLess Column:这是法律要求(法国法律)。发票号为gapLess,说明你没有去掉发票。

因为有多个用户,您无法在客户端重新计算值。只需在您的数据库中为 insert/delete 创建触发器,它将重新计算整个 table.

的 InvoiceNumber

如果您并行访问数据库,则无法避免出现漏洞。

简单案例:

  1. 过程 A) 创建发票。 (#1)
  2. 流程 B) 创建发票。 (#2)
  3. 进程 A) 回滚它的事务。
  4. 差距。

您可以为整个交易锁定整个 table。这意味着只有一个流程可以同时创建发票。对于一个人手工创建所有发票的小公司来说,这可能是可以接受的。

或者您可以将该栏留空,每晚一次锁定整个 table 并写下那些尚未设置的数字。这意味着您稍后会在发票处理过程中获得发票编号,但不会出现空白。

或者您可以再次阅读要求。德国有一些同样愚蠢的东西,但它只是为了让税务部门的表格上有这些数字。因此,您可以使用带有间隙的普通发票编号,当将它们发送到这个官僚主义的怪物时,您将仅在出口时生成一个唯一的、无间隙的编号。