@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之
生活随笔
收集整理的這篇文章主要介紹了
@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
也許大家對SQL Server中的 @@IDENTITY 都不陌生,都知道它是獲取數據表中最后一條插入數據的IDENTITY值。
?比如,表 A 中有個 ID 為自增1的字段,假設此時 ID 的值為100,現在如果我往表A插入一條數據,并在插入后
?SELECT @@IDENTITY,則其返回 101,最后一條IDENTITY域(即ID域)的值。
?
?現在問題來了,為什么說要慎用@@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 是取全局操作的最后一步操作
?所產生的自增域的值的。
?比如,表 A 中有個 ID 為自增1的字段,假設此時 ID 的值為100,現在如果我往表A插入一條數據,并在插入后
?SELECT @@IDENTITY,則其返回 101,最后一條IDENTITY域(即ID域)的值。
?
?現在問題來了,為什么說要慎用@@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 是取全局操作的最后一步操作
?所產生的自增域的值的。
總結
以上是生活随笔為你收集整理的@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 既可输入又可选择的组件
- 下一篇: word文档插入行号