【SQL Server】获取表格插入的id(二)——newID()
现在有一个需求,插入api调用日志表。然后,发起HTTP请求()请求时,需要带入日志表的id)。
简化无关的添加,SQL Server表格设计如下:
CREATE TABLE mylog ( id INT IDENTITY(1,1) PRIMARY KEY, -- 自增的主键 url NVARCHAR(255), -- 发起的路径和其他字段 flag INT DEFAULT 0, -- 执行状态 fguid NVARCHAR(36) -- 唯一编码 )
原本为用 @@IDENTITY 获取最近插入的记录,然后再发起请求,也没毛病。
INSERT INTO dbo.mylog ( url, flag ) VALUES ( N'请求的路径', -- url - nvarchar(255) 0 -- flag - int ) DECLARE @id INT = @@IDENTITY -- 获取插入的ID SELECT @id -- 根据新增id,执行下一步
获取到了最近新增的日志记录的id。
于是,好些地方都调用这个方法。直到有一天,主管经过。看来我的代码。
主管:“如果在在执行这句话的过程中,其他地方也插入了记录。会怎么样?”
我回想了一下。我还以为它只是我本地的数据库,独属于我的一对一。我没想到他已经走向社会,需要应对繁杂的事务,切换着满足这么多人的需求。我是不是要给他加一个回滚的事务?
……
主管:“这个表,我就是为了解决唯一性的问题,加了一个字段——fguid”。
SQL SERVER 有一个方法会随机生成唯一标识符——newID() 。我们可以根据唯一查关键字。
DECLARE @fguid NVARCHAR(36) = LOWER(NEWID()) INSERT INTO dbo.mylog ( url, flag, fguid ) VALUES ( N'', -- url - nvarchar(255) 0, -- flag - int @fguid -- fguid - nvarchar(255) ) DECLARE @id INT -- 获取插入的ID SELECT @id = id FROM dbo.mylog WHERE fguid = @fguid SELECT @id -- 根据新增id,执行下一步
我:原来如此。学习了,学习了!谢谢。。不过,为什么要加 LOWER() ?
主管: 小写的看着比较舒服。
有志者,事竟成,破釜沉舟,百二秦关终属楚; 苦心人,天不负,卧薪尝胆,三千越甲可吞吴。