在线系统的唯一增量编号

时间:2015-04-15 09:09:26

标签: c# sql-server

我们的客户希望我们开发基于网络的发票系统。生成的发票编号将是增量的,例如INV001,INV002,INV003等。此发票编号将在用户发出每次请求后即时生成。

我们面临的问题是,我们如何为每个用户生成一个完全唯一的增量数字?可能有100个用户访问该网站并同时请求发票。

关于使用数据库增量编号解决方案的建议,这是我的方案:

客户端同时组织多个事件,对于每个事件,发票号码应从1开始,并以1递增1.表格将包含来自各种事件的大量数据,所以显然我不能依赖在增量编号列上。以下是表格的示例(将列ID作为增量列)的示例:

id | eventName  | guestName 
1  | run for it | john doe
2  | run again  | jane doe
3  | run again  | the rock
4  | run for it | miow
5  | run again  | hohoho

因此,对于上述情况,如何为事件“为它运行”生成发票号INV001,INV002,为事件“再次运行”生成发票号INV001,INV002,INV003?

感谢

1 个答案:

答案 0 :(得分:1)

将您的活动与您的客人分开。有一个事件表,它将包含事件ID和事件名称,以及一个guest表,它将包含事件ID,访客详细信息和访客ID(增量编号)。这样您就可以使用访客ID作为发票号码的基础(您仍然需要格式化它以获得INV001,INV002等)。这是一个例子:

TblEvents
---------
Event Id (int, incremental)
Event Name (string)

TblEventGuests
---------
Event Guest Id (int, incremental) -- This will be the base for your invoice number.
Event Id (int, FK to events) 
Guest Name (string)

更新

您可以使用ROW_NUMBER功能获得所需的结果:

SELECT EventGuest_Id, Event_Id, ROW_NUMBER() OVER 
(PARTITION BY Event_Id ORDER BY EventGuest_Id) AS InvoiceNumberBase
FROM TblEventGuests
ORDER BY Event_Id, InvoiceNumberBase

下次,尽量不要过多地简化问题。如果你的问题更加准确,我相信你会早点得到答案。

Try it yourself in this sql fiddle