ما يحدث في SQL server 2005 عندما نفد من رقم "ترقيم تلقائي" عمود ؟

StackOverflow https://stackoverflow.com/questions/262106

سؤال

ماذا يحدث عندما SQL Server 2005 يحدث للوصول إلى الحد الأقصى من أجل هوية عمود ؟ هل نبدأ من البداية والبدء في إعادة تعبئة الفجوة ؟

ما هو سلوك SQL Server 2005 عندما يحدث ذلك ؟

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

المحلول

سوف تحصل على خطأ تجاوز سعة عندما يتم الوصول إلى القيمة القصوى.إذا كنت تستخدم bigint نوع البيانات مع أقصى قيمة 9,223,372,036,854,775,807 وهذا على الأرجح لن يكون الحال.

رسالة الخطأ ستحصل ، سوف تبدو مثل هذا:

Msg 220, Level 16, State 2, Line 10
Arithmetic overflow error for data type tinyint, value = 256.

(المصدر)

بقدر ما أعرف MS SQL توفر أي وظيفة لملء الهوية الثغرات ، لذا عليك أن تفعل هذا بنفسك أو تغيير نوع بيانات عمود هوية.

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

هنا هو فكرة جيدة بلوق وظيفة حول هذا الموضوع.

نصائح أخرى

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

وأنت لن تكون قادرة على إدراج صفوف جديدة وسوف تتلقى رسالة الخطأ المذكورة أعلاه حتى حل المشكلة. يمكنك القيام بذلك بعدة طرق. إذا كنت لا تزال البيانات وتستخدم كل عام معرف أدناه أقصى الحدود، سيكون لديك لتغيير نوع البيانات. إذا تم الحصول على تطهير البيانات على أساس منتظم وكان لديك الفجوة الكبيرة التي لن يتم استخدامها، يمكنك RESEED عدد الهوية إلى أقل عدد في تلك الفجوة. على سبيل المثال، في وظيفة سابقة، كنا تسجيل المعاملات. كان لدينا ربما 40-50000000 شهريا، ولكن كنا تطهير كل شيء مضى عليها أكثر من 6 أشهر، لذلك كل بضع سنوات، فإن الحصول على هوية ما يقرب من 2 مليار، ولكن سيكون لدينا شيء مع معرف أقل من 1.5 مليار دولار، ولذا فإننا سوف RESEED العودة إلى 0. مرة أخرى فمن الممكن أن أيا من هذه ستعمل لكم وسيكون لديك للعثور على حل مختلف.

إذا العمود هوية هو صحيح، ثم الأقصى هو 2147483647. سوف تحصل على خطأ تجاوز إذا كنت يتجاوز ذلك.

إذا كنت تعتقد أن هذا هو الخطر، ومجرد استخدام نوع البيانات BIGINT، والتي تعطيك ما يصل الى 9.223.372.036.854.775.807. لا أستطيع أن أتخيل جدول قاعدة بيانات مع أن العديد من الصفوف.

هنا . (نفس الارتباط كما ذكر XSL).

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

إذا قمت بحذف "القيم القديمة" من وقت لآخر تحتاج فقط إلى إعادة استخدام البذور CHECKIDENT DBCC ( 'MyTable'، RESEED، 0)؛

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