【SQL Server】獲取表格插入的id(二)——newID()
阿新 • • 發佈:2022-12-09
現在有一個需求,插入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() ?
主管: 小寫的看著比較舒服。