SQL数字列禁止间隙

时间:2015-04-02 06:00:02

标签: c# sql sql-server azure-sql-database

我在我的数据库中做发票表。我需要一个整数列来存储发票号。此栏目必须禁止数字之间的差距。身份不起作用,因为回滚会产生差距。

所以我想要的是:

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

在sql中有一种特殊的方法可以做到这一点吗? 如果sql中没有解决方案,我该如何在c#+实体中执行?

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

编辑2: 为什么我需要gapLess专栏:这是法律要求(法国法律)。发票编号为gapLess,表示您没有删除发票。

2 个答案:

答案 0 :(得分:3)

如果并行访问数据库,则无法防止间隙。

简单案例:

  1. 流程A)创建发票。 (#1)
  2. 流程B)创建发票。 (#2)
  3. 流程A)回滚它的交易。
  4. 隙。
  5. 您可以为整个交易锁定整个表格。这意味着只有一个进程可以同时创建发票。对于一个人手工制作所有发票的小公司来说,这可能是可以接受的。

    或者你可以将列留空,每晚一次锁定整个表并写下那些尚未设置的数字。这意味着您可以在发票流程的后期获取发票号,但它没有间隙。

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

答案 1 :(得分:0)

因为有多个用户,您无法在客户端重新计算价值。只需在数据库中创建插入/删除触发器,重新计算整个表的InvoiceNumber。