Pemahaman mendalam tentang fungsi @@IDENTITY
, SCOPE_IDENTITY()
, IDENT_CURRENT()
dan IDENTITY()
dalam SQL Server
Dalam pengaturcaraan pangkalan data SQL, mendapatkan nilai identiti yang dimasukkan terakhir adalah tugas kritikal. Pelbagai fungsi disediakan untuk tujuan ini, masing-masing mempunyai nuansa tersendiri. SCOPE_IDENTITY()
, IDENTITY()
, @@IDENTITY
dan IDENT_CURRENT()
ialah beberapa fungsi yang paling biasa digunakan, tetapi perbezaan antara fungsi tersebut boleh mengelirukan.
Skop Pemahaman
Memahami konsep "skop" adalah kunci untuk memahami perbezaan antara fungsi ini. Dalam SQL, skop merujuk kepada tahap di mana pertanyaan atau blok kod dilaksanakan. Terdapat dua skop utama:
Perbezaan fungsi
Berdasarkan skop dan fungsi, berikut ialah pecahan setiap fungsi:
@@IDENTITY
: Mengembalikan nilai identiti terakhir yang dibuat dalam sesi yang sama. Fungsi ini tidak bergantung pada skop pertanyaan atau prosedur tersimpan dan biasanya digunakan untuk mendapatkan nilai identiti global. SCOPE_IDENTITY()
: Mengembalikan nilai identiti terakhir yang dibuat dalam sesi dan skop yang sama. Tidak seperti @@IDENTITY
, fungsi ini hanya mempertimbangkan konteks pertanyaan semasa atau prosedur tersimpan. IDENT_CURRENT(name)
: Mengembalikan nilai identiti terakhir yang dibuat untuk jadual atau paparan tertentu, tanpa mengira sesi atau skop pertanyaan. Fungsi ini boleh digunakan untuk mendapatkan semula nilai identiti merentas pertanyaan dan sesi yang berbeza. IDENTITY()
: Tidak seperti tiga fungsi lain, IDENTITY()
digunakan terutamanya untuk menjana nilai identiti dalam SELECT...INTO
pertanyaan. Ia tidak mendapatkan semula nilai identiti sedia ada. Senario penggunaan
Untuk menggambarkan perbezaan ini, pertimbangkan senario berikut:
@@IDENTITY
. <code class="language-sql">INSERT INTO MyTable (Name) OUTPUT INSERTED.ID INTO @Identity; PRINT @Identity; -- 打印全局插入的标识值</code>
MyTable
untuk memasukkan rekod dalam jadual lain dan mendapatkan semula nilai identiti daripada kedua-dua jadual. <code class="language-sql">CREATE TRIGGER MyTrigger ON MyTable AFTER INSERT AS INSERT INTO OtherTable (Name) VALUES (NEW.Name); INSERT INTO MyTable (Name) VALUES ('Test'); SELECT @@identity AS MyIdentity; -- 打印在MyTable中插入的标识值 SELECT scope_identity() AS TriggerIdentity; -- 打印触发器在OtherTable中插入的标识值</code>
Dalam senario ini, @@IDENTITY
dan SCOPE_IDENTITY()
berkelakuan berbeza disebabkan penglibatan pencetus.
Cadangan amalan terbaik
Dalam kebanyakan kes, SCOPE_IDENTITY()
ialah fungsi yang disyorkan untuk mendapatkan semula nilai identiti terakhir yang dicipta. Ia memberikan nilai yang paling boleh dipercayai dan kontekstual dalam pertanyaan semasa atau prosedur tersimpan. Walau bagaimanapun, jika anda perlu mendapatkan semula nilai identiti dalam skop atau sesi yang berbeza, IDENT_CURRENT(name)
menyediakan fungsi tersebut.
Atas ialah kandungan terperinci Apakah Perbezaan Antara `@@IDENTITY`, `SCOPE_IDENTITY()`, `IDENT_CURRENT()` dan `IDENTITY()` dalam SQL Server?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!