اذهب إلى المحتوى

السؤال

Recommended Posts

  • 0
نشر

خاصية IDENTITY تُعيّن أرقامًا متسلسلة تلقائيًا، ولا تُعيد ترتيب الصفوف الموجودة تلقائيًا عند حذف صف.

في حال الترتيب التنازلي ضروريًا  لديك لعرض البيانات أو منطق التطبيق، ولكن ليس مرتبطًا بشكل أساسي بسلامة البيانات، فمن الأفضل عدم الاعتماد على عمود IDENTITY لذلك، وأنشئ عمودًا جديدًا (مثل DisplayOrder أو SortOrder) من نوع INT ثم قم بملء العمود بالترتيب المطلوب عند إدخال الصفوف.

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

يوجد خيار آخر أبسط، وهو إن لم تكن الفجوات في عمود IDENTITY مشكلة كبيرة لتطبيقك، فإن أبسط حل هو ترك عمود IDENTITY كما هو، وستكون الأرقام متسلسلة ولكن سيكون بها فجوات بعد عمليات الحذف، تستطيع بعد ذلك ترتيب نتائجك في الاستعلام باستخدام ORDER BY Id DESC.

DELETE FROM TB_CAT WHERE Id = 3;

SELECT * FROM TB_CAT ORDER BY Id DESC;

 

  • 0
نشر
بتاريخ 10 ساعة قال Mustafa Suleiman:

خاصية IDENTITY تُعيّن أرقامًا متسلسلة تلقائيًا، ولا تُعيد ترتيب الصفوف الموجودة تلقائيًا عند حذف صف.

في حال الترتيب التنازلي ضروريًا لديك لعرض البيانات أو منطق التطبيق، ولكن ليس مرتبطًا بشكل أساسي بسلامة البيانات، فمن الأفضل عدم الاعتماد على عمود IDENTITY لذلك، وأنشئ عمودًا جديدًا (مثل DisplayOrder أو SortOrder) من نوع INT ثم قم بملء العمود بالترتيب المطلوب عند إدخال الصفوف.

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

يوجد خيار آخر أبسط، وهو إن لم تكن الفجوات في عمود IDENTITY مشكلة كبيرة لتطبيقك، فإن أبسط حل هو ترك عمود IDENTITY كما هو، وستكون الأرقام متسلسلة ولكن سيكون بها فجوات بعد عمليات الحذف، تستطيع بعد ذلك ترتيب نتائجك في الاستعلام باستخدام ORDER BY Id DESC.

DELETE FROM TB_CAT WHERE Id = 3;

SELECT * FROM TB_CAT ORDER BY Id DESC;

 

 

لم استوعب الفكرة جيدا , 

ممكن يكون الشرح للفكرة اعمل اكثر 

بتاريخ 5 ساعة قال محمد فائز العامري2:

 

لم استوعب الفكرة جيدا , 

ممكن يكون الشرح للفكرة اعمل اكثر 

ممكن يكون الشرح للفكرة عملي اكثر 

  • 0
نشر

أقصد استخدامك لعمود IDENTITY (الذي يزيد تلقائيًا) كمفتاح أساسي وعندما تحذف صفًا، يبقى الفراغ في تسلسل الأرقام، ولا يعيد IDENTITY استخدام الأرقام المحذوفة.

لذا إما تجاهل الفراغات وذلك أبسط حل، لأنّ IDENTITY يقوم بعمله كمفتاح أساسي فريد، والفراغات لا تؤثر على عمل قاعدة البيانات إلا في حال لديك تقارير تحتاج لتسلسل متصل، لكن رتّب نتائج الاستعلام فقط عند عرضها. لا تحتاج لتغيير أي شيء في قاعدة البيانات كالتالي:

SELECT * FROM TB_CAT ORDER BY Id DESC;

أما لو الترتيب التنازلي ضروريًا دائمًا  فأضف عمودًا جديدًا لجدولك، مثل DisplayOrder من نوع INT، وسيحتوي على الترتيب الذي تريده للعرض.

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

وعند حذف صف، ستحتاج لتحديث DisplayOrder للصفوف المتبقية، وذلك يتطلب استعلام UPDATE معقد نوعًا ما.

كالتالي:

DELETE FROM TB_CAT WHERE Id = 3;

UPDATE TB_CAT
SET DisplayOrder = ROW_NUMBER() OVER (ORDER BY Id)

سيتم إعادة ترقيم DisplayOrder باستخدام ROW_NUMBER()، لكن الاستعلام سيكون بطيئًا جدًا مع الجداول الكبيرة.

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...