當(dāng)前位置:
首頁(yè) >
@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之
發(fā)布時(shí)間:2025/3/19
35
豆豆
生活随笔
收集整理的這篇文章主要介紹了
@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
也許大家對(duì)SQL Server中的 @@IDENTITY 都不陌生,都知道它是獲取數(shù)據(jù)表中最后一條插入數(shù)據(jù)的IDENTITY值。
?比如,表 A 中有個(gè) ID 為自增1的字段,假設(shè)此時(shí) ID 的值為100,現(xiàn)在如果我往表A插入一條數(shù)據(jù),并在插入后
?SELECT @@IDENTITY,則其返回 101,最后一條IDENTITY域(即ID域)的值。
?
?現(xiàn)在問(wèn)題來(lái)了,為什么說(shuō)要慎用@@IDENTITY呢?原因是 @@IDENTITY 它總是獲取最后一條變更數(shù)據(jù)的自增字段的值,
?而忽略了進(jìn)行變更操作所在的范圍約束。比如,我有表 A 和表 B 兩個(gè)表,現(xiàn)在我在表 A 上定義了一個(gè)Insert觸發(fā)器,
?當(dāng)在表 A 中插入一條數(shù)據(jù)時(shí),自動(dòng)在表 B 也插入一條數(shù)據(jù)。此時(shí),大家注意,有兩個(gè)原子操作:在A中插入一條數(shù)據(jù),?接著在B中隨后插入一條數(shù)據(jù)。
?
?現(xiàn)在我們想下,假設(shè)上面表 A 和表 B 都有IDENTITY自增域,那么我們?cè)诒?A 插入一條數(shù)據(jù)后,使用了
?SELECT @@IDENTITY 輸出時(shí),輸出的到底是 A 還是 B 的自增域的值呢?? 答案很明顯,是誰(shuí)最后插入就輸出誰(shuí),
?那么就是 B 了。于是,我本意是想得到 A 的自增域值,結(jié)果得到了 B 的自增域值,一只 BUG 隨之誕生,搞不好還
?會(huì)影響到整個(gè)系統(tǒng)數(shù)據(jù)的混亂。
?
?因此,對(duì)于這種情況,建議大家慎用 @@IDENTITY,而盡量采用 SCOPE_IDENTITY() 函數(shù)替換之。SCOPE_IDENTITY()
?也是得到最后一條自增域的值,但是它是僅限在一個(gè)操作范圍之內(nèi),而不像 @@IDENTITY 是取全局操作的最后一步操作
?所產(chǎn)生的自增域的值的。
?比如,表 A 中有個(gè) ID 為自增1的字段,假設(shè)此時(shí) ID 的值為100,現(xiàn)在如果我往表A插入一條數(shù)據(jù),并在插入后
?SELECT @@IDENTITY,則其返回 101,最后一條IDENTITY域(即ID域)的值。
?
?現(xiàn)在問(wèn)題來(lái)了,為什么說(shuō)要慎用@@IDENTITY呢?原因是 @@IDENTITY 它總是獲取最后一條變更數(shù)據(jù)的自增字段的值,
?而忽略了進(jìn)行變更操作所在的范圍約束。比如,我有表 A 和表 B 兩個(gè)表,現(xiàn)在我在表 A 上定義了一個(gè)Insert觸發(fā)器,
?當(dāng)在表 A 中插入一條數(shù)據(jù)時(shí),自動(dòng)在表 B 也插入一條數(shù)據(jù)。此時(shí),大家注意,有兩個(gè)原子操作:在A中插入一條數(shù)據(jù),?接著在B中隨后插入一條數(shù)據(jù)。
?
?現(xiàn)在我們想下,假設(shè)上面表 A 和表 B 都有IDENTITY自增域,那么我們?cè)诒?A 插入一條數(shù)據(jù)后,使用了
?SELECT @@IDENTITY 輸出時(shí),輸出的到底是 A 還是 B 的自增域的值呢?? 答案很明顯,是誰(shuí)最后插入就輸出誰(shuí),
?那么就是 B 了。于是,我本意是想得到 A 的自增域值,結(jié)果得到了 B 的自增域值,一只 BUG 隨之誕生,搞不好還
?會(huì)影響到整個(gè)系統(tǒng)數(shù)據(jù)的混亂。
?
?因此,對(duì)于這種情況,建議大家慎用 @@IDENTITY,而盡量采用 SCOPE_IDENTITY() 函數(shù)替換之。SCOPE_IDENTITY()
?也是得到最后一條自增域的值,但是它是僅限在一個(gè)操作范圍之內(nèi),而不像 @@IDENTITY 是取全局操作的最后一步操作
?所產(chǎn)生的自增域的值的。
總結(jié)
以上是生活随笔為你收集整理的@@IDENTITY 的缺点 SCOPE_IDENTITY() 取而代之的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 既可输入又可选择的组件
- 下一篇: word文档插入行号