SQL Server 中@@IDENTITY的用法

來源:互聯網
上載者:User

標籤:style   http   color   io   os   使用   ar   strong   資料   

原文地址:http://www.studyofnet.com/news/145.html 

本文導讀:@@IDENTITY是返回上次插入的標識值,標識值一般指的是自動成長值。但是如果想只返回插入到當前範圍中的值,則使用SCOPE_IDENTITY 。

用法:

用select @@identity得到上一次插入記錄時自動產生的ID

如果你使用預存程序的話,將非常簡單,代碼如下:SET @[email protected]@IDENTITY

說明:

在一條 INSERT、SELECT INTO 或大量複製陳述式完成後,@@IDENTITY 中包含此語句產生的最後的標識值。若此語句沒有影響任何有識別欄位的表,則 @@IDENTITY 返回 NULL。若插入了多個行,則會產生多個標識值,@@IDENTITY 返回最後產生的標識值。如果此語句激發一個或多個執行產生標識值的插入操作的觸發器,則語句執行後立即調用 @@IDENTITY 將返回由觸發器產生的最後的標識值。若 INSERT 或 SELECT INTO 語句失敗或大量複製失敗,或事務被復原,則 @@IDENTITY 值不會還原為以前的設定。

如果語句和事務失敗,它們會更改表的當前標識,從而使識別欄位中的值出現不連貫現象。即使未提交試圖向表中插入值的事務,也永遠無法復原標識值。例如,如果因 IGNORE_DUP_KEY 衝突而導致 INSERT 語句失敗,表的當前標識值仍然會增加。

在返回插入到表的 @@IDENTITY 列的最後一個值方面,@@IDENTITY、SCOPE_IDENTITY 和 IDENT_CURRENT 函數類似。

@@IDENTITY 和 SCOPE_IDENTITY 將返回在當前會話的所有表中產生的最後一個標識值。但是,SCOPE_IDENTITY 只在當前範圍內傳回值,而 @@IDENTITY 不限於特定的範圍。

@@identity執行個體

USE AdventureWorks;
GO
--Display the value of LocationID in the last row in the table.
SELECT MAX(LocationID) FROM Production.Location;
GO
INSERT INTO Production.Location (Name, CostRate, Availability, ModifiedDate)
VALUES (‘Damaged Goods‘, 5, 2.5, GETDATE());
GO
SELECT @@IDENTITY AS ‘Identity‘;
GO
--Display the value of LocationID of the newly inserted row.
SELECT MAX(LocationID) FROM Production.Location;
GO

    @@identity使用注意事項


  我們要慎用@@IDENTITY,原因是 @@IDENTITY 它總是擷取最後一條變更資料的自增欄位的值,
而忽略了進行變更操作所在的範圍約束。比如,我有表 A 和表 B 兩個表,現在我在表 A 上定義了一個Insert觸發器,當在表 A 中插入一條資料時,自動在表 B 也插入一條資料。此時,大家注意,有兩個原子操作:在A中插入一條資料, 接著在B中隨後插入一條資料。

  現在我們想下,假設上面表 A 和表 B 都有IDENTITY自增域,那麼我們在表 A 插入一條資料後,使用了 SELECT @@IDENTITY 輸出時,輸出的到底是 A 還是 B 的自增域的值呢? 答案很明顯,是誰最後插入就輸出誰,那麼就是 B 了。於是,我本意是想得到 A 的自增域值,結果得到了 B 的自增域值,一隻 BUG 隨之誕生,搞不好還會影響到整個系統資料的混亂。

  因此,對於這種情況,建議大家慎用 @@IDENTITY,而盡量採用 SCOPE_IDENTITY() 函數替換之。SCOPE_IDENTITY() 也是得到最後一條自增域的值,但是它是僅限在一個操作範圍之內,而不@@IDENTITY 是取全域操作的最後一步操作所產生的自增域的值的。

 

SQL Server 中@@IDENTITY的用法

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.