c# - SQL 数值列禁止间隙

标签 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#+entity怎么办?

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

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

最佳答案

如果您并行访问您的数据库,则无法避免出现间隙。

简单案例:

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

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

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

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

关于c# - SQL 数值列禁止间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29405988/

相关文章:

sql - 如何从另一个表中获取第一个表的行数?

c# - 请求对象的浏览器类型值不一致

sql-server - 将日期列从 excel 导入 SSIS - 在 SQL 中获取长日期格式

sql - Exec <存储过程> 非常慢

mysql - 如何搜索JSON数据关联数组mysql 5.5

mysql - SQL:基于多对多表的条件的不同用户的计数

高尔夫比分的 mySQL 数据库模式

c# - 为什么我的 OrderBy 错误没有给出编译器警告?

c# - 添加(BezierSegment 到 a) Canvas 路径

c# - 如何在不知道它包含哪种对象的情况下搜索列表框?