سؤال

ما هي أفضل طريقة للحصول على IDENTITY من إدراج الصف ؟

أنا أعرف عن @@IDENTITY و IDENT_CURRENT و SCOPE_IDENTITY ولكن لا أفهم إيجابيات وسلبيات تعلق على بعضها.

يمكن للشخص يرجى شرح الفروق و عندما يجب أن تستخدم كل منها ؟

هل كانت مفيدة؟

المحلول

  • @@IDENTITY ترجع الماضي الهوية القيمة التي تم إنشاؤها على أي طاولة في الدورة الحالية في جميع المجالات. عليك أن تكون حذرا هنا, لأنه عبر النطاقات.هل يمكن الحصول على قيمة من الزناد ، بدلا من البيان.

  • SCOPE_IDENTITY() ترجع الماضي الهوية القيمة التي تم إنشاؤها على أي طاولة في الدورة الحالية النطاق الحالي. عموما ما كنت ترغب في استخدام.

  • IDENT_CURRENT('tableName') ترجع الماضي الهوية قيمة إنشاء جدول معين في أي دورة في أي نطاق.هذا يتيح لك تحديد الجدول الذي تريد من القيمة ، في حال اثنين أعلاه ليست تماما ما تحتاجه (نادرة جدا).أيضا ، كما @الرجل ستاربوك ورد "هل يمكن استخدام هذا إذا كنت ترغب في الحصول على الهوية الحالية القيمة الجدول الذي لديك لا يتم إدراج سجل في."

  • على OUTPUT شرط من INSERT البيان سوف تمكنك من الوصول إلى كل الصفوف التي تم إدراجها عبر هذا البيان.لأنه راقب المحددة بيان انها أكثر وضوحا من الوظائف الأخرى المذكورة أعلاه.ومع ذلك, انها قليلا أكثر مطول (سوف تحتاج إلى إدراج في جدول متغير/temp الجدول ثم استعلام) ويعطي نتائج حتى في خطأ السيناريو حيث البيان هو التراجع.أنه قال: إذا كان الاستعلام يستخدم خطة تنفيذ متوازي ، وهذا هو فقط طريقة مضمونة للحصول على الهوية (قصيرة من إيقاف التوازي).ومع ذلك ، فإنه يتم تنفيذها قبل المشغلات ولا يمكن استخدامها للعودة الزناد ولدت القيم.

نصائح أخرى

وأعتقد الأكثر أمانا والأكثر دقة طريقة استرجاع إدخال معرف باستخدام الإخراج شرط.

على سبيل المثال (مأخوذة من التالي MSDN المادة)

USE AdventureWorks2008R2;
GO
DECLARE @MyTableVar table( NewScrapReasonID smallint,
                           Name varchar(50),
                           ModifiedDate datetime);
INSERT Production.ScrapReason
    OUTPUT INSERTED.ScrapReasonID, INSERTED.Name, INSERTED.ModifiedDate
        INTO @MyTableVar
VALUES (N'Operator error', GETDATE());

--Display the result set of the table variable.
SELECT NewScrapReasonID, Name, ModifiedDate FROM @MyTableVar;
--Display the result set of the table.
SELECT ScrapReasonID, Name, ModifiedDate 
FROM Production.ScrapReason;
GO

أنا أقول نفس الشيء مثل غيرها من الرجال ، لذلك الجميع صحيح, أنا فقط أحاول أن تجعل الأمر أكثر وضوحا.

@@IDENTITY إرجاع معرف آخر شيء تم إدراجها من قبل العميل الخاص بك اتصال قاعدة البيانات.
أكثر من مرة هذا يعمل بشكل جيد, ولكن في بعض الأحيان الزناد سوف تذهب إدراج صف جديد لا تعرف عنه و سوف تحصل على معرف من هذا الصف الجديد بدلا من واحدة تريد

SCOPE_IDENTITY() يحل هذه المشكلة.تقوم بإرجاع معرف آخر شيء إدراج في SQL البرمجية أرسلت إلى قاعدة البيانات.إذا مشغلات الذهاب و خلق مزيد من الصفوف ، لن يسبب قيمة خاطئة للحصول على عاد.الصيحة

IDENT_CURRENT ترجع آخر بطاقة الهوية التي تم إدراجها من قبل أي شخص.إذا كان بعض التطبيقات الأخرى يحدث لإدراج صف آخر في unforunate الوقت ، سوف تحصل على معرف من هذا الصف بدلا من واحدة.

إذا كنت تريد أن تلعب بأمان ، استخدم دائما SCOPE_IDENTITY().إذا كنت العصا مع @@IDENTITY و شخص ما تقرر إضافة الزناد في وقت لاحق على التعليمات البرمجية الخاصة بك سوف كسر.

أفضل (قراءة:أسلم) طريقة للحصول على هوية حديثا إدراج صف واحد باستخدام output شرط:

create table TableWithIdentity
           ( IdentityColumnName int identity(1, 1) not null primary key,
             ... )

-- type of this table's column must match the type of the
-- identity column of the table you'll be inserting into
declare @IdentityOutput table ( ID int )

insert TableWithIdentity
     ( ... )
output inserted.IdentityColumnName into @IdentityOutput
values
     ( ... )

select @IdentityValue = (select ID from @IdentityOutput)

إضافة

SELECT CAST(scope_identity() AS int);

إلى نهاية إدراج sql, ثم

NewId = command.ExecuteScalar()

سوف استرداد.

MSDN

@@الهوية ، SCOPE_IDENTITY ، IDENT_CURRENT هي وظائف مماثلة في عودتهم القيمة الأخيرة إدراجها في الهوية عمود من الجدول.

@@الهوية SCOPE_IDENTITY سيعود الماضي الهوية القيمة التي تم إنشاؤها في أي جدول في الدورة الحالية.ومع ذلك ، SCOPE_IDENTITY بإرجاع القيمة فقط ضمن النطاق الحالي;@@الهوية لا تقتصر على النطاق المحدد.

IDENT_CURRENT لا يقتصر نطاق الدورة ؛ فإنه يقتصر على جدول معين.IDENT_CURRENT بإرجاع قيمة الهوية إنشاء جدول معين في أي دورة في أي نطاق.للحصول على مزيد من المعلومات ، راجع IDENT_CURRENT.

  • IDENT_CURRENT هي الدالة التي تأخذ طاولة الحجة.
  • @@الهوية قد يعود مربكة نتيجة عندما يكون لديك الزناد على الطاولة
  • SCOPE_IDENTITY هو البطل الخاص بك أكثر من مرة.

عند استخدام إطار الكيان ، فإنه يستخدم داخليا OUTPUT تقنية عودة المدرج حديثا ID القيمة

DECLARE @generated_keys table([Id] uniqueidentifier)

INSERT INTO TurboEncabulators(StatorSlots)
OUTPUT inserted.TurboEncabulatorID INTO @generated_keys
VALUES('Malleable logarithmic casing');

SELECT t.[TurboEncabulatorID ]
FROM @generated_keys AS g 
   JOIN dbo.TurboEncabulators AS t 
   ON g.Id = t.TurboEncabulatorID 
WHERE @@ROWCOUNT > 0

الإخراج يتم تخزين النتائج في جدول مؤقت متغير, انضم إلى العودة إلى طاولة المفاوضات ، والعودة الصف قيمة من الجدول.

ملاحظة:ليس لدي فكرة لماذا EF أن الداخلية الانضمام إلى الزوال الجدول مرة أخرى إلى ريال الجدول (تحت أي ظرف من الظروف أن اثنين ليس مباراة).

ولكن هذا ما EF لا.

هذه التقنية (OUTPUT) متوفر فقط على SQL Server 2008 أو أحدث.

@@الهوية آخر الهوية إدراج الحالية باستخدام اتصال SQL.هذا هو قيمة جيدة للعودة من إدراج الإجراء المخزن حيث تحتاج فقط هوية المدرج الجديد الخاص بك سجل و لا يهمني إن أكثر من الصفوف أضيفت بعد ذلك.

SCOPE_IDENTITY آخر الهوية إدراج الحالية باستخدام اتصال SQL ، في النطاق الحالي-أي إذا كان هناك هوية الثانية إدراجها بناء على الزناد بعد الخاصة بك إدراج لن تنعكس في SCOPE_IDENTITY, فقط أدخل قمت بها.بصراحة لم يكن لدي سبب استخدام هذا.

IDENT_CURRENT(tablename) آخر الهوية إدراج بغض النظر عن اتصال أو نطاق.هل يمكن استخدام هذا إذا كنت ترغب في الحصول على الهوية الحالية القيمة الجدول الذي لديك لا يتم إدراج سجل في.

لا أستطيع التحدث إلى إصدارات أخرى من SQL Server ، ولكن في عام 2012 ، إخراج مباشرة يعمل على ما يرام.أنت لا تحتاج إلى عناء مع جدول مؤقت.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES (...)

بالمناسبة هذا الأسلوب يعمل أيضا عند إدراج صفوف متعددة.

INSERT INTO MyTable
OUTPUT INSERTED.ID
VALUES
    (...),
    (...),
    (...)

الإخراج

ID
2
3
4

دائما استخدام scope_identity () لم يكن هناك حاجة إلى أي شيء آخر.

بعد إدراج بيان تحتاج إلى إضافة هذا.وتأكد حول اسم الجدول حيث إدخال البيانات.سوف تحصل على الصف الحالي لا يوجد فيها صف تتأثر فقط الآن قبل إدراج البيان.

IDENT_CURRENT('tableName')

إذا كنت تبحث عن آخر معرف إضافة/تحديث هذا قد يكون قليلا من المدرسة القديمة, ولكن هناك الكثير من الناس استخدام كبار السن PHP, قبل 5.5 أن تكون أكثر دقة.مزيد من التفاصيل يمكن العثور عليها في http://php.net/manual/en/function.mysql-insert-id.php

$last = mysql_insert_id();

إنشاء uuid و أيضا أدخله إلى عمود.ثم يمكنك بسهولة تحديد صف واحد مع uuid.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top