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

اعادة تسلسل رقم السجلات في الجدول

بدأه dmw في 23 نوفمبر 2013 · 13 رد · 3,402 مشاهدة · في قواعد بيانات Microsoft SQL Server
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم اريد معرفة كيفية اعادة ترتيب عمود ال id للسجلات بشكل متسلسل بعد حذف احدى السجلات بحيث يبقى تسلسل ارقام السجلات في الجدول علما باني استخدمت AUTO-INCREMENT على عمود id وايضا هو primary key

#2

هل من حل ايها الاخوة

#3

لا يمكن إعادة تسلسل حقل auto increment الا بإلغائه وتكوينه من جديد فقط

#4

لا انصح بهذا لا ياثر عدم السلسل في سير البرنامج وهذا للمستقبل وحماية البيانات واما المسلسل فيكون في التقرير

1
#5

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


 


أخي الكريم يمكن ذلك و بكل بساطة و لكن عليك أن تزيل خاصية الـ Identity من العمود المذكور أولا.. و إليك مثال كتبته من أجلك :


 

-- لننشئ الجدول التالي من أجل المثال 

 

Create Table Student(Id int primary key, Name Varchar(50))

Go

 

-- ندخل بعض 

البيانات

Insert Student(Id, Name) Values(1, 'Ahmad')

Insert Student(Id, Name) Values(2, 'Samer')

Insert Student(Id, Name) Values(3, 'Saleem')

Insert Student(Id, Name) Values(4, 'Hany')

Insert Student(Id, Name) Values(5, 'Hala')

Go

 

-- دعنا ننشئ 

إجرائية مخزنة مسؤولة عن حذف سجل من الجدول السابق

Create Proc Student_Delete 

 

@Id int 

 

As



Delete Student Where Id = @Id


 

----- تصحيح 

الترقيم يبدأ هنا



Declare @curId int 



Declare @C Cursor 




Set @C = Cursor dynamic for Select Id From Student Where Id > @Id Order By Id



Open @C



Fetch Next From @C into @curId  



While (@@fetch_status = 0) 



begin 



update Student Set Id = @curId - 1 Where current of @C


Fetch Next From @C into @curId 


end


Go

 

 

-- لنختبر 


exec Student_Delete @Id = 2

 

 

 

 

-- لنشاهد الآن محتويات الجدول

 

Select * From Student

تم تعديل هذه المشاركة بواسطة imadouzoun في 2 ديسمبر 2013 في 17:10

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

#6

@KARIMSOFt

+1

 

@dmw

انا لا انصح بذلك ايضا. اذا لم تعرف ان تتحكم بالكود فانك ستواجه مخاطر جمة ويمكن ان يؤدي ذلك الى فقدان الترابط بين الجداول (parent & child)

 

هناك طريقة انا اتبعها لعمل ذلك ولكنها ليست من ضمن logic تبع البرنامج بل هي utility خاصة استعملها للتصحيح واعادة الربط بين الجداول في حال وجود orphan rows

 

1- الحصول على قيمة ال identity

dbcc checkident('table_name')

2- اسنخراج القيم من النتيجة محتاج لكود اذا اردت ان ارسله لاحقا اذا كنت مصمم

 

3- تغيير قيمة identity

DBCC checkident('table_name',RESEED,new_value)

Samir Ibrahim

VFP Blog

VB.NET Blog

#7

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

 

يوجد أيضاً طريقة أخرى بسيطة و هي أن تجلب السجل ذو قيمة الـ ID الأعلى و تضعه مكان السجل المحذوف (أي تعطيه ID السجل الذي تريد حذفه) و تكون بذلك أزلت الفراغ الناجم عن حذف سجل.

 

تحياتي

تم تعديل هذه المشاركة بواسطة imadouzoun في 4 ديسمبر 2013 في 14:49

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة 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

#8

بارك الله فيكم جميعاً 

سؤال حول نفس الموضوع

وماذا عن اذا كان عندي حقل ID نوع بياناته Int ولكن ليس Identity  واستخدمة لتوليد سيريال خاص بي عن طريق هذه الجمله

Select isnull(Max (HAdd_doc),0) + 1

ثم قمت بحذف سجل في منتصف السجلات ثم أردت ان اقوم عند جلب السيريال الذي عليه الدور ان يراعي السجلات المحذوفه ويقترحها عليا أولاً اذا كان هناك سجلات محذوفه أما اذا كان هناك سجلات غير محذوفه يأخذ السجل الذي يليه من الجدول الاول

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

تم تعديل هذه المشاركة بواسطة محمد فؤاد تركي في 6 ديسمبر 2013 في 22:12

1

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#9

السلام عليكم و رحمة الله ..



بالتأكيد يمكنك أن تنجز ذلك و إليك مثال حضرته لهذا الغرض:






 

use tempdb
go

Create Table Students(Id int primary key, Name Varchar(50))

--
Insert Students(Id, Name) Select 1, 'Samer'
Insert Students(Id, Name) Select 2, 'Ahmad'
Insert Students(Id, Name) Select 3, 'Salem'
Insert Students(Id, Name) Select 4, 'Ameer'
Insert Students(Id, Name) Select 5, 'Salem'
go


Create function GetProperID()
returns int
as
begin

declare @Id int, @i int = 1

declare @C cursor

Set @c = cursor for Select Id from Students order by Id

open @c
fetch next from @c into @Id

while ( @@fetch_status = 0 )
begin

if(@Id <> @i)
begin
return @i
end

set @i = @i + 1
fetch next from @c into @Id

end

return @i

end
go


الاختبار


 

-- Situation 1
select dbo.GetProperID()


-- Situation 2
Delete Students Where Id = 3
select dbo.GetProperID()

-- -- Situation 3
Delete Students
select dbo.GetProperID()

تحياتي

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة 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

#10

ممتاز

بارك الله بك

certifiedj.jpg

 

 

Image Hosted by ImageShack.us
#11

جرب هذا الكود اعتقد اسرع

declare @T table ([nCode] [int] IDENTITY(1,1) NOT NULL,[pnCitizenCode] [int])
INSERT INTO @T
SELECT pnCitizenCode 
FROM pCitizen
ORDER BY pnCitizenCode

select top(1) [nCode] 
from @T
WHERE [nCode] <>[pnCitizenCode]
ORDER BY nCode
#12

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

 

يا صديقي ليست أسرع بالتأكيد حسب الـ Execution Plan Study : عبارات الـ DML على Memory Tables لا تكون أسرع من Cursor على عبارة SQL.

 

 

هذا إذا لم أقل لك أيضا أنني تجنبت استخدام خيارات المؤشر المتقدمة كالخيار fast_forward لجعله سريعاً جداً. 

Create function GetProperID()
returns int
as
begin

declare @Id int, @i int = 1

declare @C cursor

Set @c = cursor fast_forward for Select Id from Students order by Id

open @c
fetch next from @c into @Id

while ( @@fetch_status = 0 )
begin

if(@Id <> @i)
begin
return @i
end

set @i = @i + 1
fetch next from @c into @Id

end

return @i

end

تحياتي

تم تعديل هذه المشاركة بواسطة imadouzoun في 8 ديسمبر 2013 في 23:35

دروس و كتب مفيدة----------------------كتيب الإجرائيات المخزنةتعرف على اللغة 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

#13

لا اسطيع ان اتكلم بعد قول الخبير imadouzoun فهو اقدر مني وانا احترم رايه ولكن اخبرني بتفصيل عن fast_forward

#14

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

 

 

بارك الله فيك أخي كريم ..

 

بالنسبة للمؤشر Fast_Forward فهو يعمل مع بيانات الجدول بشكل مباشر و لا ينشئ نسخة من بيانات الجدول في الـtempdb كما تفعل أنواع أخرى, عدا عن كون هذا الخيار يحد من عمليات الـ Update, Delete على السجل الحالي للمؤشر أثناء المرور عليه بحلقة. فيكون هذا المؤشر بالتالي مزيج لخاصيتين Forward_only, Read_only و طبعاً مع Optimization لتسريع الـ Loop على السجلات.

 

Forward_only: هناك أنواع أخرى من المؤشرات تسمح لك بإنجاز أنواع مختلفة من جلب السجلات (غير  Fetch Next) و ذلك لأغراض مختلفة على خلاف هذا النوع الذي لا يسمح إلا بالسير للأمام.

 

بالمناسبة كتبت مقالة عن هذا المؤشرات بشيء من التفصيل و ذكرت هذا النوع فيها:

 

/index.php/topic/108624-المؤشرات-في-ال-sql-server/#entry551207

 

لاحظ أن ردي السابق يحوي Fast_Forward Cursor في الدالة التي كتبتها.. سهل الاستخدام جداً.

 

مع فائق احترامي. 

تم تعديل هذه المشاركة بواسطة imadouzoun في 9 ديسمبر 2013 في 07:57

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

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