【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() ?

主管: 小写的看着比较舒服。

posted @ 2022-12-09 11:19  陆陆无为而治者  阅读(687)  评论(0编辑  收藏  举报