我有一个带有auto_increment id的MSSQL表。现在我需要一个额外的唯一itemID(bigint),它包含这种格式的创建日期:yyyymmdd ###
所以,例如第一个itemID是20170823001,2017082300n .. 如果日期更改,则应以1:201708240001
重新启动目前我通过SELECT MAX(itemID)在我的c#应用程序中实现它,然后在c#代码中进行比较(如果那天已经添加了项目)。
然而问题是这是在webapi上运行的,并且有可能两个不同的查询获得MAX(itemID)相同的结果并生成相同的新itemID。这将导致至少一个客户端出现异常。
所以我试图在sql server上直接实现它,以避免重复。
答案 0 :(得分:0)
为分区生成唯一ID并不容易,因为内置的identity
为整个表生成唯一值,而不是它的一部分。还有其他选择,但以下内容很容易实现,并且可以在并发环境中使用。
表结构是:
IF OBJECT_ID('[dbo].[DataSource]') IS NOT NULL
BEGIN;
DROP TABLE [dbo].[DataSource];
END;
CREATE TABLE [dbo].[DataSource]
(
[RecordID] INT PRIMARY KEY IDENTITY (1,1)
,[DateAdded] DATE CONSTRAINT DF_DataSource_DateAdded DEFAULT (GETUTCDATE())
,[value] NVARCHAR(128)
);
{1}}将始终是唯一的,因为SQL Server正在处理其值。我们有[RecordID]
列,以便知道何时插入值。在这种情况下,您只需填充[DateAdded]
列。
假设我们有以下数据:
[value]
将在读取时创建自定义INSERT INTO [dbo].[DataSource] ([DateAdded], [value])
VALUES ('2017-08-23 00:00:00', 'value 01')
,('2017-08-23 00:00:00', 'value 02')
,('2017-08-24 00:00:00', 'value 03')
,('2017-08-25 00:00:00', 'value 05')
,('2017-08-25 00:00:00', 'value 06')
,('2017-08-25 00:00:00', 'value 07');
列,并使用以下语句:
ID
是的,您没有实现数据库中的SELECT *
,CONCAT(CONVERT(CHAR(8), [DateAdded],112), ROW_NUMBER() OVER (PARTITION BY [DateAdded] ORDER BY [RecordID])) AS [ID]
FROM [dbo].[DataSource] ;
,并且您需要在每次需要时生成它,但您不必再担心处理密钥的唯一性。< / p>