我正在我的数据库中处理发票表。我需要一个整数列来存储发票号。此列必须禁止数字之间的差距。标识不起作用,因为回滚会产生间隙。
所以我想要的是:
InvoiceId(Primary key identity) InvoiceNumber(Unique, NOT NUll)
1 1
2 2
10 3
13 4
sql 中是否有特殊的方法来执行此操作? sql没有解决办法,c#+entity怎么办?
编辑 1: 附加信息:永远不会删除一行。
编辑 2: 为什么我需要 gapLess Column:这是法律要求(法国法律)。发票号为空,说明您没有删除发票。
最佳答案
如果您并行访问您的数据库,则无法避免出现间隙。
简单案例:
- 流程 A) 创建发票。 (#1)
- 流程 B) 创建发票。 (#2)
- 进程 A) 回滚它的事务。
- 差距。
您可以为整个事务锁定整个表。这意味着只有一个流程可以同时创建发票。对于一个人手工创建所有发票的小公司来说,这可能是可以接受的。
或者您可以将该列留空,每晚一次锁定整个表格并写入那些尚未设置的数字。这意味着您稍后会在发票处理过程中获得发票编号,但不会出现空白。
或者您可以再次阅读要求。德国有一些同样愚蠢的东西,但它只是为了让税务部门的表格上有这些数字。因此,您可以使用带有间隙的普通发票编号,当将它们发送到这个官僚主义的怪物时,您将仅在导出时生成一个唯一的、无间隙的编号。
关于c# - SQL 数值列禁止间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29405988/