告诉我如何正确实现以下获取唯一键的逻辑。键应包含以下数据:该行在数据库中创建的年份和月份,以及每个月从 1 开始的序列号,当月数据库中每新行该值应增加 1 .
要添加到表中的第一行必须具有以下唯一标识符:{Текущий год}{separator}{Текущий месяц}{separator}{Порядковый номер}
目前它是这样实现的:
- 从数据库中获取最后一行
- 我们解析一个唯一标识符并将其放入变量中:
year,month,number 我们得到该行为的序列号:
currentNumber = currentMonth == month ? number++ : 1;CREATE TABLE dbo.[table] (Id int IDENTITY, Number varchar(50) NULL, CONSTRAINT PK_table_Id PRIMARY KEY CLUSTERED (Id))
如果我不能表达问题的主要意思,我很抱歉,我不明白如何正确实现准确获取文档的序列号,如何保证其在一个月内的唯一性,以及在一个月内归零变化
我建议创建一个单独的表,其中将记录每个月的最后一个 ID。例如这样的:
可以使用以下查询以原子方式获取下一个 ID:
它是如何与我们一起完成的。
1.添加记录时,没有分配单据号(我们说的是单据号,对吧?)。该条目被分配了一个代理键(身份列)。该键由触发器放置在处理队列中(在我们的例子中是 Service Broker)。
2. 队列处理程序从队列中接收一个键,为具有该键的条目生成一个编号,并分配该条目编号。
由于处理程序是唯一的,它按照先进先出原则工作——我们可以保证没有锁和维护秩序。由于处理程序是异步的(记录创建不等待分配一个数字) - 这不会减慢创建记录的过程。
不使用自然键而是使用代理键是正确的。在将行添加到数据库后,如果您需要它,请形成您的“唯一”键。在您的情况下,保持“独特性”仍然是“痔疮”。
UPD关于打印表格所需的“唯一标识符”。就个人而言,我不会存储需要解析的字符串,但会有两个字段 - 一个存储文档的日期,另一个存储整数序列号,并在请求。
聊天中的 UPD 2在一个月内收到唯一号码:
Id从Id当前记录中减去它