ورود

View Full Version : سوال: َشیفت دادن اطلاعات



peymanjon
شنبه 31 مرداد 1388, 22:22 عصر
سلام
من یک برنامه نوشتم نام کاربران را میگیرد و در table مورد نظر در بانک SQL برنامه ام ذخیره میکند،Identity Specification کلید table خودم را Yes کردم ،همانطور که می دونید ID یا همون ستون کلید من بصورت خودکار شماره گذاری میشود،مشکل من در اینجاست که حالا که برنامه را نصب کرده ام اگر یکی از کاربران در برنامه توسط کاربر حذف شود آن سطر با ID آن حذف می شود ولی ID های بعد از آن شیفت پیدا نمیکند ،به عنوان مثال اگر کاربر جدید که می خواهد اضافه شود ID آن 4 باشد و بلافاصله بعد درج کاربر جدید ،آن را در برنامه حذف کنم و دوباره یک کاربر جدید بخواهم درج کنم بجای آنکه در شماره 4 که الان حذف شده است قرار بگیرد و ID آن 4 بشود برای آن ID شماره 5 را در نظر میگیرد و کلآ سطر شماره 4 Null است.
لطفآ مرا راهنمایی کنید که آیا راهی برای این مشکل هست یا خیر؟

محمد سلیم آبادی
شنبه 31 مرداد 1388, 22:40 عصر
سلام،
اگر من بخواهم این کار را بکنم با استفاده از تابع Identitiy Into این کار را انجام می دهم.

ولی در سایت SQLteam.com در بخش Articles by tags دقیقا به این مساله پرداخته شده است.

peymanjon
شنبه 31 مرداد 1388, 23:23 عصر
سلام،
اگر من بخواهم این کار را بکنم با استفاده از تابع Identitiy Into این کار را انجام می دهم.

ولی در سایت SQLteam.com در بخش Articles by tags دقیقا به این مساله پرداخته شده است. شنبه 31 مرداد 1388 21:52 عصر
محبت کنید یکمی بیشتر در مورد این تابع توضیح بدهیدو اینکه چجوری میتونه به من کمک کنه ،من تازه با SQL شروع به کار کردم و زیاد بلد نیستم.مرسی

محمد سلیم آبادی
شنبه 31 مرداد 1388, 23:40 عصر
SELECT your_columns_without_ID ,
ID=IDENTITIY(int,1,1)
INTO #temp
FROM your_table

DELETE your_table
INSERT INTO your_table
SELECT * FROM #temp

DROP #temp

محمد سلیم آبادی
یک شنبه 01 شهریور 1388, 00:11 صبح
اول ورود شما را به این سایت بزرگ تبریک می گم. و نکته ای که به نظرم می رسد این است که همیشه قبل از ایجاد یک تاپیک جدید یک جستجو بکنید سپس حداقل اگر هم جواب را پیدا نکردید با جزئیات مساله بیشتر آشنا می شوید.

راجب به کد های پس قبلی باید بگم که :
تابع identity به هر سطری یک شماره می دهد که می توانید خودتان مشخص کنید که من شروع مقدار دهی را از یک آغاز کردم و یکی یکی نیز افزایش دادم سپس این نتیجه داخل یک جدول موقت ذخیره شده و سپس کل سطر های جدولی اصلی را حذف می کنیم و به جای آن سطر های جدول موقت را در آن درج می کنیم.

فکر نمی کنم این روش، روش صحیحی و کارامدی باشد.

peymanjon
یک شنبه 01 شهریور 1388, 01:14 صبح
مرسی از خوشامدگویی شما دوست گلم...
فکر می کنید توی حجم بالای دادهها و اینکه این برنامه بخواهد توی یک local area اجرا بشود و تحت شبکه با این حجم delet و درج موجدد به مشکل بر نمیخورم؟

محمد سلیم آبادی
یک شنبه 01 شهریور 1388, 01:25 صبح
درج و حذف مشکلی بوجود نمی آورد؟
حتما همین طور است، یک بار بطور آزمایشی حدود 500 هزار سطر را خواستم با یک حلقه ی while در یک جدول درج کنم در حدود چند دقیقا به طول انجامید! کلا عملیات درج و حذف و ... بدلیل اینکه باید log شوند و عملیات I/O صورت بگیرد برای سیستم کارهای پر هزینه ای هستند.


ببینید دوست من، ما ستون ID را فقط برای کلید اصلی جدولمون استفاده می کنیم حتی برخی افراد کلید اصلی جدول خودشون را از نوع NEWID انتخاب می کنند که یک کد 16 رقمی است و بطور تصادفی اعدادی را انتخاب می کند مهم این است که سطرهای جدول یک مقدار منحصر بفرد یا Unique داشته باشند.
اگر می خواهید در نتیجه query یک ستون داشته باشید که شماره سطر را به نمایش در بیارد من به شما تابع ROW_NUMBER را پیشنهاد می کنم.