هل يتم إعادة استخدام المفاتيح الأولية العددية للسجلات المحذوفة في قاعدة بيانات للحصول على سجلات جديدة في المستقبل؟

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

سؤال

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

// SQL Server ، MySQL. //

سؤال المتابعة: ماذا يحدث عندما ينفد محرك DB من الأرقام لاستخدامه في المفاتيح الأساسية؟

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

المحلول

رقم. لن يتم إعادة استخدام المفاتيح الأولية العددية ، إلا أنك تحددها يدويًا (يجب أن تتجنب هذا حقًا!)

نصائح أخرى

afaik ، هذا استطاع يحدث في MySQL:

كيف يعمل معالجة Auto_increment في Innodb:

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

بعد إعادة تشغيل الخادم. innodb إعادة استخدام قيم Auto_increment التي تم إنشاؤها مسبقًا.:

الإصلاح المقترح: يجب ألا يفقد جدول InnoDB مسار الرقم التالي لعمود Auto_increment بعد إعادة التشغيل.

يعتمد على نظام التعقيد التلقائي. إذا كنت تستخدم تسلسلًا من أي نوع ، فلن يتم إعادة استخدام أرقام السجلات المحذوفة ، لأن التسلسل لا يعرفها.

بشكل عام ، لا ، لا يتم إعادة استخدام الأرقام.

ومع ذلك ، يمكنك - في منتجات مثل Oracle - تحديد مولد تسلسل يدور حوله وسيعيد استخدام الأرقام.

سواء كانت هذه أرقام من السجلات المحذوفة أم لا ، فهذه مشكلة تطبيقاتك.

يجب أن يكون هذا السؤال أكثر دقة:

... "مع تسلسل أوراكل"

... "مع أعمدة MySQL Autonumber"

... إلخ...

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

- أدخل رقم آخر إدخال صالح في الجدول وليس الرقم التالي المراد استخدامه

DBCC Checkent ([tableName] ، Reseed ، [numberyOyOwantTostartat])

هذا بالطبع مجنون ... ويجب ألا يتم القيام به :)

لن يقوم MySQL بإعادة استخدام IDS إلا إذا كنت truncate الجدول أو delete from الجدول بدون where بند (في هذه الحالة mysql ، داخليًا ، ببساطة يقوم truncate).

ليس تحديدا. إذا تتم قراءة المفتاح من سلسلة هوية التسلسل أو التلقائي ، فسيقوم التسلسل بتوصيل القيمة التالية وإنتاجها. ومع ذلك ، يمكنك إلغاء تنشيط هذا (set identity_insert on على SQL Server) ووضع أي رقم تريده في العمود طالما أنه لا ينتهك قيد التفرد.

نعم ، يعتمد الأمر حقًا على طريقة إنشاء المعرف.

وض حسنًا ، ولكن إذا كان هناك بالفعل GUID هناك ، فستحصل على انتهاك رئيسي لقيود المفاتيح.

أنا أعتبر "ميزة" MySQL لإعادة استخدام معرف هو خطأ.

النظر في شيء مثل معالجة تحميل الملفات. يعد استخدام معرف قاعدة البيانات كاسم ملف هو ممارسة جيدة: بسيطة ، لا خطر على مآثر مع أسماء الملفات التي يقدمها المستخدم ، إلخ.

لا يمكنك حقًا جعل كل شيء معاملات عندما يكون نظام الملفات متورطًا ... سيتعين عليك ارتكاب معاملة قاعدة البيانات ثم اكتب الملف ، أو كتابة الملف وارتكاب معاملة قاعدة البيانات ، ولكن إذا فشل أحد أو كليهما ، أو لديك إن تعطل ، أو نظام ملفات الشبكة الخاص بك له ملاءمة ، قد يكون لديك سجل صالح في قاعدة البيانات ولا يوجد ملف ، أو ملف بدون سجل قاعدة بيانات ، لأن الشيء ليس ذريًا.

في حالة حدوث مثل هذه المشكلة ، وأول شيء يفعله الخادم عند العودة هو الكتابة فوق المعرفات ، وبالتالي الملفات ، للمعاملات المتروفة ، فإنه تمتص. يمكن أن تكون هذه الملفات مفيدة.

لا ، تخيل لو قرر مصرفك إعادة استخدام حسابك _id - arghhhh !!

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