我在我的数据库中做发票表。我需要一个整数列来存储发票号。此栏目必须禁止数字之间的差距。身份不起作用,因为回滚会产生差距。
所以我想要的是:
InvoiceId(Primary key identity) InvoiceNumber(Unique, NOT NUll)
1 1
2 2
10 3
13 4
在sql中有一种特殊的方法可以做到这一点吗? 如果sql中没有解决方案,我该如何在c#+实体中执行?
编辑1: 附加信息:永远不会删除一行。
编辑2: 为什么我需要gapLess专栏:这是法律要求(法国法律)。发票编号为gapLess,表示您没有删除发票。
答案 0 :(得分:3)
如果并行访问数据库,则无法防止间隙。
简单案例:
您可以为整个交易锁定整个表格。这意味着只有一个进程可以同时创建发票。对于一个人手工制作所有发票的小公司来说,这可能是可以接受的。
或者你可以将列留空,每晚一次锁定整个表并写下那些尚未设置的数字。这意味着您可以在发票流程的后期获取发票号,但它没有间隙。
或者您可以再次阅读要求。德国有一些同样愚蠢的东西,但它只是为税务部门提供了这些数字。因此,您可以使用带有间隙的正常发票编号,并在将它们发送到这种官僚主义的怪物时,您将在出口时生成唯一的无间隙编号。
答案 1 :(得分:0)
因为有多个用户,您无法在客户端重新计算价值。只需在数据库中创建插入/删除触发器,重新计算整个表的InvoiceNumber。