Mai mult
Cel mai bun mod de a obține identitatea introdus rând?
Ceea ce este cel mai bun mod de a obține "IDENTITATE" a introdus rând?
Știu despre @@IDENTITY " și "IDENT_CURRENT" și " SCOPE_IDENTITY
dar nu't înțelegeți argumentele pro și contra atașat la fiecare.
Poate cineva să explice diferențele și când ar trebui să folosesc fiecare?
1051
13
@@IDENTITY
a se întoarce la ultimul identitatea valoarea generată pentru orice masă în sesiunea curentă, în toate domeniile. Aveți nevoie pentru a fi atent aici, deoarece's pe domenii. Ai putea lua o valoare dintr-o declanșa, în loc de curent declarație.SCOPE_IDENTITY()
a se întoarce la ultimul identitatea valoarea generată pentru orice masă în sesiunea curentă și domeniul de aplicare actual. În general, ceea ce doriți să utilizați.IDENT_CURRENT('tableName')
returnează ultima identitatea valoarea generată pentru un anumit tabel, în orice sesiune și orice aplicare. Acest lucru vă permite să specificați ce masa vrei valorii de, în cazul în care cele două de mai sus sunt't destul de ceea ce ai nevoie (foarte rar). De asemenea, ca @Tip Starbuck menționat, "Ai putea folosi această opțiune dacă doriți pentru a obține curent de IDENTITATE valoare pentru un tabel care nu ați introdus un disc în."A "de IEȘIRE" clauză a
INSERT
declarație va permite accesul la fiecare rând care a fost introdus prin această declarație. Deoarece's referă la situația specifică, l's mai simplă decât alte funcții de mai sus. Cu toate acestea,'s un pic mai verbose (te'll nevoie pentru a introduce într-o masă variabilă/temp masă și apoi interogare care) și dă rezultate chiar și într-o eroare de scenariu în cazul în care declarația este derulată înapoi. Asta a spus, dacă interogare utilizează un plan de executie paralele, acest lucru este singura metodă garantată pentru obtinerea de identitate (scurt de oprirea paralelism). Cu toate acestea, este executat înainte declanșează și nu poate fi folosit pentru a reveni declanșa generat de valori.Cred că cea mai sigură și cea mai precisă metodă de recuperare a introdus id-ul ar fi utilizarea de ieșire clauză.
de exemplu (luat de la următoarele MSDN articol)
Am'm a spune același lucru ca și ceilalți, astfel încât toată lumea's corecte, am'm doar încercarea de a face mai clar.
@@IDENTITY
returnează id-ul de ultimul lucru care a fost introdus de către client's de conectare la baza de date. De cele mai multe ori funcționează bine, dar, uneori, un declanșator va merge și de a introduce un rând nou, care nu't știu despre, și te'll a obține ID-ul de la acest nou rând, în loc de cea pe care o vreiSCOPE_IDENTITY()
rezolvă această problemă. Returnează id-ul de ultimul lucru pe care - ai introdus în cod SQL - ai trimis la baza de date. Dacă declanșează du-te și de a crea rânduri suplimentare, au câștigat't că valoarea sa a revenit. UraIDENT_CURRENT
returnează ultimul ID-ul care a fost introdus de către oricine. Dacă o altă aplicație se întâmplă pentru a introduce un alt rând de la un nenoroc timp,'ll a obține ID-ul de pe rândul respectiv, în loc de unul.Dacă doriți să-l joace în condiții de siguranță, folosiți întotdeauna
SCOPE_IDENTITY()
. Dacă rămânem cu `@@de IDENTITATE și cineva decide să adăugați un declanșa mai târziu, tot codul dvs. va rupe.Cele mai bune (a se citi: cel mai sigur) mod de a obține identitatea nou-introdus rând este de a folosi "de ieșire" clauza:
Adauga
la sfârșitul introduce declarație sql, apoi
va recupera.
Atunci când utilizați Entity Framework, se foloseste intern "de IEȘIRE" tehnica pentru a reveni din nou-introdus ID-ul valoare
Rezultatele de ieșire sunt stocate într-un tabel temporar variabilă, s-au alăturat înapoi la masă, și a reveni la rând valoarea din tabel.
Notă: nu am idee de ce EF-ar inner join efemer masă a întors la masă (în ce circumstanțe ar cele două nu se potrivesc).
Dar asta's ce EF nu.
Această tehnică ("de IEȘIRE") este disponibil doar pe SQL Server 2008 sau mai nou.
MSDN
@@IDENTITY este ultimul identitate introdus folosind curent de Conexiune SQL. Aceasta este o valoare buna pentru a reveni la o introduce proceduri stocate, în cazul în care ai nevoie doar de identitatea introdus pentru nou record, și don't pasă dacă mai multe rânduri au fost adăugate ulterior.
SCOPE_IDENTITY este ultimul identitate introdus folosind curent de Conexiune SQL, și în domeniul de aplicare actual-care este, dacă a existat o a doua IDENTITATE introdus bazat pe un declanșator după inserare, ea nu s-ar fi reflectat în SCOPE_IDENTITY, doar introduceți-ați efectuat. Sincer, nu am avut niciodată un motiv pentru a utiliza aceasta.
IDENT_CURRENT(nume tabelă) este ultimul identitate introdus indiferent de conexiune sau de aplicare. Ai putea folosi această opțiune dacă doriți pentru a obține curent de IDENTITATE valoare pentru un tabel care nu ați introdus un disc în.
Pot't vorbesc cu alte versiuni de SQL Server, dar în 2012, scoate direct functioneaza foarte bine. Nu't nevoie să deranjez cu un tabel temporar.
Apropo, aceasta tehnica, de asemenea, funcționează atunci când introduceți mai multe rânduri.
Ieșire
ÎNTOTDEAUNA utilizarea scope_identity(), nu's N-o mai am nevoie de nimic.
Creați un uuid și introduce, de asemenea, pentru o coloană. Apoi, puteți identifica cu ușurință rând cu uuid. Asta e singura 100% soluție de lucru puteți pune în aplicare. Toate celelalte soluții sunt prea complicate sau nu sunt de lucru în același cazuri de margine.
După Declarația Insert aveți nevoie pentru a adăuga acest lucru. Și Asigurați-vă că despre nume de tabel în cazul în care datele este introducerea.Veți obține curent rând nu în cazul în care rând afectate acum de a introduce declarație.
Dacă sunteți în căutarea pentru ultimul ID adaugat/actualizat, acest lucru poate fi un pic mai old-school, dar există o mulțime de persoane care folosesc mai vechi PHP, Pre 5.5 pentru a fi mai precis. Mai multe detalii pot fi găsite la http://php.net/manual/en/function.mysql-insert-id.php