الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

إعادة ترقيم العمود التلقائي

بدأه imadouzoun في 19 يونيو 2014 · 1 رد · 2,218 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم و رحمة الله و بركاته :

 

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

 

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

 

و هذا مثال من الألف إلى الياء:

 
use tempdb
go
 
 
-- إنشاء جدول للمثال
Create Table TestTB(Id int identity, Name varchar(50) )
Go
 
-- ادخال بيانات 

Insert into TestTB(Name) Select 'Ahmad' 
Insert into TestTB(Name) Select 'Smeer' 
Insert into TestTB(Name) Select 'Ibraheem' 
Insert into TestTB(Name) Select 'Salem' 
Insert into TestTB(Name) Select 'Hala' 
Insert into TestTB(Name) Select 'Nehad' 
go

-- خلق فجوة في الترقيم عن طريق حذف سجلات في الوسط

Delete From TestTB Where Name in ('Smeer' , 'Ibraheem')
go

-- مشاهدة البيانات بعد خلق الفجوة للمعاينة
Select * From TestTB
Go

-- حل المشكلة
-- إضافة عمود جديد للجدول بدون ترقيم تلقائي 
Alter Table TestTB Add IDNew int 
Go

-- نقل القيم من عمود الترقيم التلقائي إلى العمود الجديد
Update TestTB Set IDNew = Id 
Go
-- معاينة الجدول بعد إضافة العمودSelect * From TestTBGo

خطوات هامة:

1- احذف كل العلاقات ما بين العمود القديم و باقي الجداول على أن تدونها على ورقة لكي تعيد انشائها لكن مع العمود الجديد

 

2- اجعل العمود الجديد مفتاح رئيسي بدلا من العمود القديم

 

3- أعد إنشاء المفاتيح الثانوية لكي تتعامل مع العمود الجديد مع تفعيل الخيار On Update Cascade

 

4- بعد التأكد من أن العلاقات قد تم انشاؤها بشكل صحيح يمكن اعادة ترقيم العمود الجديد بالكامل ..

 

ملاحظة مهمة

يجب أن يكون الخيار On Update Cascade موجود في كل العلاقات التي أعدت إنشاءها

بحيث عندما تعيد ترقيم العمود الجديد (الذي أصبح مفتاح رئيسي) فإنها

تنعكس على المفتاح الثانوي في الجدول المرتبط بهذا العمود

 -- إعادة الترقيم باستخدام المؤشر الديناميكي

Declare @C Cursor Set @C = Cursor dynamic for Select IdNew from TestTB for update 

Declare @NewId int = 1 
open @C Fetch Next From @C 

While (@@FETCH_STATUS = 0) 
begin 

Update TestTB Set IdNew = @NewId Where Current of @C 

Set @NewId = @NewId + 1 

Fetch Next From @C 
end 
Go

 -- حذف العمود القديم 

Alter Table TestTB Drop Column Id 

Go

 -- تغيير اسم العمود الجديد ليصبح مطابق لاسم القديم 

exec sp_rename 'TestTB.IdNew' , 'Id' 

Go

-- معاينة بعد التعديلات

Select * From TestTB

Go
-- بدلاً من الترقيم التلقائي أنصح بالقيام بذلك بشكل يدوي لأنه يعطيك ديناميكية أكبر للتعامل مع هذا العمود 

-- و هذا مثال على إجراء اضافة سجل و اعطاء العمود الرقم التالي المناسب 

Create proc TestTB_Insert
 @Id int = null out,
 @Name Varchar(50) = null 
AS 

  Select @Id= IsNull(max(Id), 0) + 1 from TestTB

  Insert TestTB(Id, Name) Select @Id, @Name

GO

أرجو الفائدة للجميع

تم تعديل هذه المشاركة بواسطة imadouzoun في 19 يونيو 2014 في 16:15

1

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة Transact SQL <<-->> كتيب عن تنصيب قواعد البيانات Sql Server باللغة العربية كتيب عن إنشاء قواعد البيانات في SQL Server باللغة العربية <<-->> درس مع الأمثلة عن المؤشرات و التعامل معها في الـ T-SQLالعبارات الشرطية و الحلقات في T-SQL <<-->> شرح لبعض الـ Extended Stored Procedure استخدام مكتبات الـ Dot Net الخاصة بك في الـ Sql Server 2005 <<-->> التعامل مع المصفوفات من خلال الـ T-SQLتعابير الجداول الشائعة في SQL Server 2005 <<-->>الاتصال بالأداة SQL Server Management Studioحلول سريعة و لمحات برمجية --------------------------------التصدير إلى إكسل : طريقة أولى : طريقة بسطر واحد من الكود <<-->> طريقة ثانية : طريقة تحتاج إنشاء إجرائية مخزنةً تجهيز بيانات جدول بالصيغة XML تمهيداً لحفظها كملف <<-->> تصدير البيانات إلى ملفات نصية برمجياً إغلاق جميع الإتصالات المفتوحة بقاعدة بيانات محددة .. تمهيداً لاسترجاعها أو حذفها <<-->> الاستعلام بناء على وقت مخزن بالصيغة العربية ضمن حقل نصي ..حذف السجلات المتكررة و إبقاء عدد محدد منها في جدول.. <<-->> أسرع طريقة لحذف سجلات جدول كيف احصل على اسم جهازي والباسوورد باستخدام T-SQL <<-->> حشر أنواع الصور المختلفة في حقل من نوع Image باستخدام إجرائية مخزنة .كيف تعرف أنواع الصور المخزنة في حقل من نوع Image .. <<-->> إجرائيات مخزنة ببارامترات ديناميكية مفيدة جداً للاستعلامات استخدام رقم الحقل بدلاً من الإسم في عبارات الإستعلام <<-->> من هو أضخم الجداول في قاعدة بياناتي ؟معرفة زمن تنفيذ الإجرائيات ( لتختار الطريقة الأسرع بين إجرائياتك المخزنة ) <<-->> التعامل مع الـ Rules برمجياً الحصول على آخر صف في الجدول <<-->> قراءة ملفات XML باستخدام T-SQL برمجياً (مثال مرفق)سحب بيانات ملف إكسل إلى الـ SQL Server <<-->> تشفير النسخة الاحتياطية بكلمة مرور <<-->> التخلص من البيانات المكررة <<-->> حل مشكلة التاريخ الهجريDifferential Backup بالتعريف---------- لا إله إلا الله .. محمد رسول الله

أخوكم في الله..  Imad Ozone

#2

إعادة الترقيم ستحدث مشاكل في قاعدة البيانات خصوصاً عندما يكون عمود الترقيم التلقائي مستخدم في بناء علاقات مع جداول آخرى.

مواضيع مشابهة