PDA

View Full Version : سوال: آپدیت کردن فیلد ID در sql به صورت دستی با حلقه for



vb-sosol
جمعه 19 مهر 1392, 13:15 عصر
سلام؛در برنامه ام یه جدولی دارم که یکسری داده توسط کاربر اضافه میشه.خودم یک id برای هر کدوم از داده ها که وارد میکنه اضافه میکنم که به صورت دستی اضافه میشه نه اتوماتیک خود بانک sql
حالا میخوام وقتی کاربر یکی از داده ها را انتخاب کرد و حذفش کنه شماره id رکورد بعدی یکی ازش کم بشه یعنی در واقع کل شماره id ها مرتب بشه
اگر مثلا شماره ها 120-121-122 بود و 121 را حذف کرد رکورد 122 بشه 121 و الی آخر
امیدوارم متوجه منظورم شده باشد :ناراحت:
برای این کار من از حلقه for استفاده میکنم و کل داده هام رو میخونم و فیلد id رو با یک متغییر که از 1 شروع میشه و هر دفعه پلاسش میکنم ، آپدیتش میکنم
ولی اتفاقی که میوفته شماره آخرین متغییر برای همه id ها در نظر میگره !!!

راه حلش چیه؟

ببخشید انقدر طولانی توضیح دادم

behnam-soft
جمعه 19 مهر 1392, 20:44 عصر
سلام
دوست عزیز اینکار شما به هیچ وجه منطقی نیست !!! منم چند وقت پیش همچین قصدی داشتم اما بعد از کلی تحقیق فهمیدم که اینکار توجیهی - حداقل در پروژه من - نداره چرا که نیازی به اینکار نیست!!! شما دلیل کارت رو بگو اگر قانع کننده بود، من بهت می گم چیکار کنی.

ordebehesht
جمعه 19 مهر 1392, 21:30 عصر
من یه متد بازگشتی برای اینکار تو پروژم نوشتم که بصورت راندوم این کار رو کنه یعنی ابتدا کد تولید میشه بعد جستجو میکنه که تو db‌نباشه اگه بود یه کد دیگه تا کد منحصر به فرد یکتا رو پیدا کنه خیلی هم خوبه
اما به نظر من ردییف تو این جور برنامه ها گذاشتن کار بیخودی البت شاید شما دلیل واسه کار خود دارید

vb-sosol
جمعه 19 مهر 1392, 23:28 عصر
سلام
دوست عزیز اینکار شما به هیچ وجه منطقی نیست !!! منم چند وقت پیش همچین قصدی داشتم اما بعد از کلی تحقیق فهمیدم که اینکار توجیهی - حداقل در پروژه من - نداره چرا که نیازی به اینکار نیست!!! شما دلیل کارت رو بگو اگر قانع کننده بود، من بهت می گم چیکار کنی.

خب خیلی ساده هست
برای نمایش داده ها تنها فیلد جستجو میشه همین شماره id هست
اگر شماره id ها به ترتیب نباشه یعنی مثلا 120-121-122 باشه و 121 رو حذف کنه خب اگر در جستجو 121 رو جستجو کنه خب طبیعتا ارور میده
این در حالی هست که کاربر هیچ گاه از شماره id ها خبر نداره

vb-sosol
شنبه 20 مهر 1392, 22:30 عصر
کسی راه حلی برای این مشکل سراغ نداره؟

vb-sosol
دوشنبه 22 مهر 1392, 12:29 عصر
تا حالا کسی با این مشکل روبرو نشده
راه حلش چیه؟:ناراحت:

mohsen22
سه شنبه 23 مهر 1392, 00:40 صبح
سلام .. اینجا (http://barnamenevis.org/showthread.php?401009-%D8%B5%D9%81%D8%B1%DA%A9%D8%B1%D8%AF%D9%86-%D9%85%D9%82%D8%AF%D8%A7%D8%B1-%D9%81%DB%8C%D9%84%D8%AF-%DA%A9%D9%87-primary-key-%D9%87%D8%B3%D8%AA%D8%B4-%D9%88-%D8%A7%D8%B2-%D9%86%D9%88%D8%B9AutoNumber)من هم تقریبا یه همچین منظوری داشتم اما هرگز جوابمو نگرفتم !!!؟؟ امیدوارم اینجا جواب بگیرم

Vitallity
سه شنبه 23 مهر 1392, 01:33 صبح
منظورت اینه که id از 1 تا 1000 رو داری و مثلاً اگر 120 رو حذف کردی تمام id های بعد 120 یکی کم بشه ؟ این کار بهینه نیست چون باید تمام رکوردهایی که بعد از رکوردی رو که حذف می‌کنی Update کنی.

UPDATE 'table' SET id=id-1 where id > deletedID

vb-sosol
سه شنبه 23 مهر 1392, 13:07 عصر
منظورت اینه که id از 1 تا 1000 رو داری و مثلاً اگر 120 رو حذف کردی تمام id های بعد 120 یکی کم بشه ؟ این کار بهینه نیست چون باید تمام رکوردهایی که بعد از رکوردی رو که حذف می‌کنی Update کنی.

UPDATE 'table' SET id=id-1 where id > deletedID



بله دقیقا
یک شماره کم بشه
خب بهینه نیست چه روشی بهینه است؟

mohsen22
چهارشنبه 24 مهر 1392, 13:48 عصر
بطور ساده می خواهیم ای دی ها هرز نره! همیشه اخرین و بیشترین ای خالی و استفاده نشده باشه

ordebehesht
چهارشنبه 24 مهر 1392, 14:42 عصر
ببینید دوست من id یک کد منحصر به فرده در کل برنامه نباید تغییر کنه اما چیزیکه تو این تایپیک مورد سوال قرار گرفته id به عنوان ردیف در یک سطر هستش که بذبلیل همین مورد گفتم کهدادن ردیف مورد نیاز نیست اما من توبرنامه خودم کد منحصر به فرد رو یک کد تصادفی گذاشتم به نظرم همین کار مرود خوبه

veniz2008
چهارشنبه 24 مهر 1392, 14:57 عصر
سلام؛در برنامه ام یه جدولی دارم که یکسری داده توسط کاربر اضافه میشه.خودم یک id برای هر کدوم از داده ها که وارد میکنه اضافه میکنم که به صورت دستی اضافه میشه نه اتوماتیک خود بانک sql
حالا میخوام وقتی کاربر یکی از داده ها را انتخاب کرد و حذفش کنه شماره id رکورد بعدی یکی ازش کم بشه یعنی در واقع کل شماره id ها مرتب بشه
اگر مثلا شماره ها 120-121-122 بود و 121 را حذف کرد رکورد 122 بشه 121 و الی آخر

تغییر id (فیلد کلید) یک جدول بدین شکل کاملا اشتباه و بسیار خطرناک هست. دلیل؟
این موجودیتی که شما بهش id اختصاص میدی ممکنه بارها در جداول دیگه مورد استفاده قرار بگیره. در جداول دیگه از همین id استفاده می کنید. حالا اگر این id رو تغییر بدی باید علاوه بر تغییر id های جدول مورد بحث، سایر جداولی هم که به این id وابسته هستن رو ویرایش کنید. با یه دید ساده کاملا قابل فهم هست که این کار کاملا اشتباه هست.


برای نمایش داده ها تنها فیلد جستجو میشه همین شماره id هست
اگر شماره id ها به ترتیب نباشه یعنی مثلا 120-121-122 باشه و 121 رو حذف کنه خب اگر در جستجو 121 رو جستجو کنه خب طبیعتا ارور میده
این در حالی هست که کاربر هیچ گاه از شماره id ها خبر نداره
یعنی چی خطا میده؟
وقتی دنبال id می گردیم که اون id وجود نداره، رکوردی برگشت داده نمیشه نه اینکه خطایی رخ بده.
در کل به نظر من هیچ ایرادی نداره که فاصله میان عدد ها بیفته.مهم اینه که این اعداد منحصر بفرد باشن.
موفق باشید.

vb-sosol
چهارشنبه 24 مهر 1392, 17:58 عصر
تغییر id (فیلد کلید) یک جدول بدین شکل کاملا اشتباه و بسیار خطرناک هست. دلیل؟
این موجودیتی که شما بهش id اختصاص میدی ممکنه بارها در جداول دیگه مورد استفاده قرار بگیره. در جداول دیگه از همین id استفاده می کنید. حالا اگر این id رو تغییر بدی باید علاوه بر تغییر id های جدول مورد بحث، سایر جداولی هم که به این id وابسته هستن رو ویرایش کنید. با یه دید ساده کاملا قابل فهم هست که این کار کاملا اشتباه هست.

یعنی چی خطا میده؟
وقتی دنبال id می گردیم که اون id وجود نداره، رکوردی برگشت داده نمیشه نه اینکه خطایی رخ بده.
در کل به نظر من هیچ ایرادی نداره که فاصله میان عدد ها بیفته.مهم اینه که این اعداد منحصر بفرد باشن.
موفق باشید.


ببینید برنامه من طوری هست که چند تا عدد رندوم تولید میشه
حالا بر اساس این اعداد رندوم توی دیتابیس سرچ میکنم و محتویاتش رو نمایش میدم(که شامل یکسری اطلاعات هست)
یه امکانی توی برنامه ام قرار دادم که کاربر خودش هم بتونه اون اطلاعات رو اضافه کنه
وقتی اضاف میکنه خب من با توجه به آخرین شماره id رکوردم بهمش یه شماره اضافه میکنم و به رکورد جدید کاربر اختصاص میدهم
توی این مورد مشکلی ندارم
مشکل وقتی پیش میاد که بین چند تا داده که وارد کرده بخواد یکی رو حذف کنه !!!
خب اگر عدد رندوم که تولید میشه دقیقا شماره ای باشه که کاربر حذف کرده خب مسلمنا اطلاعاتی که قراره نشون داده بشه به کاربر دیگه نشون نمیده و این اصلا خوب نیست
حالا راه حل چیه؟:ناراحت:

veniz2008
چهارشنبه 24 مهر 1392, 18:16 عصر
ببینید برنامه من طوری هست که چند تا عدد رندوم تولید میشه
حالا بر اساس این اعداد رندوم توی دیتابیس سرچ میکنم و محتویاتش رو نمایش میدم(که شامل یکسری اطلاعات هست)
یه امکانی توی برنامه ام قرار دادم که کاربر خودش هم بتونه اون اطلاعات رو اضافه کنه
وقتی اضاف میکنه خب من با توجه به آخرین شماره id رکوردم بهمش یه شماره اضافه میکنم و به رکورد جدید کاربر اختصاص میدهم
توی این مورد مشکلی ندارم
مشکل وقتی پیش میاد که بین چند تا داده که وارد کرده بخواد یکی رو حذف کنه !!!
خب اگر عدد رندوم که تولید میشه دقیقا شماره ای باشه که کاربر حذف کرده خب مسلمنا اطلاعاتی که قراره نشون داده بشه به کاربر دیگه نشون نمیده و این اصلا خوب نیست
حالا راه حل چیه؟:ناراحت:
راه حل بسیار ساده هست.
به جای اینکه بین یک بازه یک عدد رندوم تولید کنی که احتمالش وجود داره که اون عدد، داخل جدول نباشه (رکوردش حذف شده باشه) به جاش بیا از بین داده های جدولت که وجود دارند یک عدد رندوم تولید کن و مطمئنا این عدد رندوم داخل رکوردها وجود داره چراکه از بین رکوردهای موجودت یک عدد رندوم رو بیرون کشیدی.
برای تولید عدد رندوم در سمت دیتابیس از بین رکوردهای موجود کد کوتاه زیر رو استفاده کن :

select top(1) * from TblQuestion
order by NEWID()
در کد بالا ()NEWID و (1)TOP باعث میشه که هربار یک رکورد تصادفی تولید و برگشت داده بشه.
اینطوری با یک تیر چندین نشون رو میزنی.
هم عدد رندوم رو در میاری (همون id که با رکورد برگشت داده میشه) ،
هم رکوردی رو برگشت میدی که id اون همون عدد رندوم هست،
هم سرعت بسیار بیشتری رو خواهی داشت،
و هم دردسر کارت به مراتب کمتر خواهد بود.

vb-sosol
چهارشنبه 24 مهر 1392, 19:05 عصر
مرسی دوست عزیز حالا تستش میکنم انشالا که جواب بده
فقط یک سوال رندوم که میده احتمال تکراری بودنش وجود داره؟
چون این مسئله خیلی برام مهمه

mohsen22
چهارشنبه 24 مهر 1392, 19:09 عصر
نمی دونم چرا هیچ کی منو نمی بینه!!!؟؟
فرض کنید در یک بانک می خواهم همون ای دی رو بعنوان شماره حساب به مشتری بدیم . . حالا فرض کنید به مشتری شماره حسابش کنسل بشه.. چگونه اون شماره حساب هدر رفته رو به مشتری دیگری اختصاص بدیم!؟

ordebehesht
چهارشنبه 24 مهر 1392, 19:32 عصر
ببینید این موارد از یک سریال شماره با دامنه محدود استفاده نمیکنن همیشه یک عدد تصادفی میدن که منحصر بفرده و غیر قابل تغییر چرا که همونطور که دوستان گفتن ممکنه تو جداول دیگه تغییر کنه و نباید تغییر کنه و این نمیشه با هر با ر تغییر شماره اونو به مشتری اطلاع داد

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

یادت باشه نبایذ کلیذ اصلی تغییر کنه

plus
چهارشنبه 24 مهر 1392, 19:33 عصر
نمی دونم چرا هیچ کی منو نمی بینه!!!؟؟
فرض کنید در یک بانک می خواهم همون ای دی رو بعنوان شماره حساب به مشتری بدیم . . حالا فرض کنید به مشتری شماره حسابش کنسل بشه.. چگونه اون شماره حساب هدر رفته رو به مشتری دیگری اختصاص بدیم!؟
معمولا شماره حسابی که مربوط به کس دیگه ای بوده و کنسل شده رو دوباره استفاده نمیکنن.شما با یک فیلد معمولی int میتونی چند میلیون عدد داشته باشه لزومی نداره نگران اون تعداد از شماره هایی باشی که دیگه نمیشه استفاده کرد، مگر اینکه مساله خاص باشه.

veniz2008
چهارشنبه 24 مهر 1392, 19:58 عصر
فقط یک سوال رندوم که میده احتمال تکراری بودنش وجود داره؟
چون این مسئله خیلی برام مهمه
ببینید این دستوری که نوشتم به این شکل عمل میکنه :
متد ()NEWID چینش و ترتیب رکوردهای جدولت رو به هم میزنه و دستور (1)TOP از این رکوردهای تصادفی اولین رکورد رو میکشه بیرون.
منظور شما رو از تکراری متوجه نشدم. یعنی ممکنه کاربر پشت سر هم چند بار درخواست id (عدد رندوم) کنه؟ اگر اینطوری هست بله امکانش هست که این دستور رکورد تکراری برگردونه. اگر این مدلی هست تغییر زیر رو در کوئری بالایی که گفتم لحاظ کنید. این تغییر به این صورت هست که id هایی که در مرحله قبل بدست اومدن رو از نتیجه خارج میکنه و هیچوقت رکورد تکراری برگشت داده نمیشه. در کد زیر من برای مثال گفتم یک رکورد تصادفی برگردون به شرطی که id اون 2، 3 یا 4 نباشه. شما باید به جای این اعداد، اعدادی رو که در مرحله قبل بدست آوردی رو به کوئری بدی تا رکورد تکراری برگشت داده نشه.

select top(1) * from TblQuestion
where QuestionID NOT IN(2,3,4)
order by NEWID()

mohsen22
چهارشنبه 24 مهر 1392, 20:52 عصر
ذکر یک مثال کوچولو شاید بتونه روند بحث رو بهتر کنه.. من شروع کردم به نوشتنش! کسی هم اگه داره بزاره تا زودتر به نتیجه برسیم .. مرسی از همه