PDA

View Full Version : تغییر اتوماتیک مقدار فیلد



dada_shi
جمعه 14 مرداد 1390, 01:46 صبح
دوستان من تو دیتابیس خودم یک primery key دارم که auto number هست.حالا وقتی یک ردیفی از این جدول حذف میشه ،میخوام اون فیلد اتونامبر من خودش تشخیص بده و مثلا اگر ردیف 9 حذف شده ، ردیف 10 بیاد جاش و یک ردیف خالی وجود نداشته باشه.یعنی از آخر کم بشه.

Nima0711
جمعه 14 مرداد 1390, 02:15 صبح
من مدت ها این مشکل رو داشتم ولی در آخر به این نتیجه رسیدم که هیچ راهی درستی برای این موضوع نیست ولی چند تا روش دور زدن ارائه دادن که نظر شخصی من نیست

Nima0711
جمعه 14 مرداد 1390, 02:22 صبح
از این روش می توانید برای re-assign کردن استفاده کنید
به علت اینکه من از دیتابیس شما مطلع نبودم sql Statement برای شما نوشتم


ALTER TABLE `tabelName` DROP `whatFieldYouWant`;
ALTER TABLE `tabelName` AUTO_INCREMENT = 1;
ALTER TABLE `tabelName` ADD `whatFieldYouWant` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

در کل الگوریتم استفاده شده در این کد این است که
1- فیلد با افزایش خود کار خدف می شود.
2- افزایش خودکار را به 1 تغییر داده
3- تولید یک فیلد جدید با امکان افزایش خودکار با همان نام

یا علی

badguy
جمعه 14 مرداد 1390, 03:35 صبح
چه لزومی داره که این کارو کنی؟ تو میتونی هر کاری رو که دلت میخواد!! با همین Primary Key های نامرتب انجام بدی!!
در ضمن وقتی حجم دیتا بیست زیاد شه مشکلات جدی خواهی داشت!
اگه سرعت و درگیر بودن CPU & I/O برات مهم نیس روش بالا روش خوبی به نظر میرسه ولی اگه قراره با حجم بالایی از دیتا ها کار کنی و 100% اصرار داری که این کارو کنی اون وقت باید وقت بذاری و یه Custom SQL متناسب با نیاز های خودت بنویسی!!
موفق باشی

dada_shi
جمعه 14 مرداد 1390, 05:07 صبح
فکر نمیکرم انقدر پیچیده باشه.گفتم شاید خود sql server امکانی داشته باشه که شماره ها رو خودش ترتیب بده.خیلی هم ضایعه هستش.چون مثلا از شماره 8 میپره رو 10 .این فیلد هم فقط برای شمارش رکوردها استفاده میشه.نیازی به ثابت بودن شماره ها نیست.

badguy
جمعه 14 مرداد 1390, 05:15 صبح
نه اشتباه نکن این فیلد یه Primary Key هستش و برایه یگانه سازی رکورد ها در دیتا بیس استفاده میشن! مثل شماره شناسنامه ی آدما مثلا وقتی یه نفر میمره(حدف میشه) آیا شماره شناسنامه ها ریست میشن؟؟
اگه میخوای تعداد رکورد ها رو بدونی از تابع Count [ بسته به نوع دیتا بیس ] استفاده کن.

فک کنم برا این میخوای این Primary key ها ریست شن برا اینکه در به جدول یا یه همچین چیزی نشون بدی؟ اگه به این منظور باشه اینجا یه Counter میذاری که به ازای هر رکورد Counter+=1 میشه اینجوری میتونی از همون چیزی که میگی " از 8 میپره به 10 " در ظاهر کار خلاص شی!
موفق باشی

dada_shi
جمعه 14 مرداد 1390, 05:22 صبح
اینی که میگی درست.ولی راهی نداره که مثلا این ستون ریست بشه یا از نوع شماره بندی بشه؟


از این روش می توانید برای re-assign کردن استفاده کنید
به علت اینکه من از دیتابیس شما مطلع نبودم sql Statement برای شما نوشتم


ALTER TABLE `tabelName` DROP `whatFieldYouWant`;
ALTER TABLE `tabelName` AUTO_INCREMENT = 1;
ALTER TABLE `tabelName` ADD `whatFieldYouWant` int UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY FIRST;

در کل الگوریتم استفاده شده در این کد این است که
1- فیلد با افزایش خود کار خدف می شود.
2- افزایش خودکار را به 1 تغییر داده
3- تولید یک فیلد جدید با امکان افزایش خودکار با همان نام

یا علی

من مبتدی هستم.لطفا توضیح میدی چطوری از این کدها استفاده کنم؟

badguy
جمعه 14 مرداد 1390, 05:27 صبح
یه سوال میخوای با اینا چکار کنی که این همه اصرار بر ریست داری؟ ( واقعا جایه سوال شد از این همه اصرار!!!:متفکر: )
تو حتی میتونی یه فیلد مخصوص به این کار رو اصلا ایجاد کنی! هدفت از این کار چیه؟

samanff2000
جمعه 14 مرداد 1390, 16:37 عصر
سلام دوست عزیز
این کار به هیچ عنوان کار خوبی نیست و پیشنهاد میکنم دنبال این کار نرو بجای این که بخوایی اینو ریست کنی بهتره که یک ستون به بانک اضافه کنی مثلا با نام شماره که در اون از یک شروع کنی به شماره گذاری و وقتی که میخوای فیلیدی رو اضافه کنی بیایی بری توی اون ستون و آخرین عدد رو بخونی و با 1 جمع کنی و ثبت کنی که البته باز هم اگر از وسط چیزی رو پاک کنی با همین مشکل روبرو میشی اما برای رفع این مشکل میتونی در کد هات قرار بدی که هر روز یا هر هفته و... بیاد و این ستون رو از 1 تا آخر درست کنه باز این بهتر از اینه که بیایی و کلید اصلی رو تغییر بدی و البته باید این رو هم بگم که اگه تعدادشو میخوایی همن جور که دوستمون گفت از count استفاده کن و درکل از این فکر بیا بیرون چون درصورتی که شما رکورد های زیادی داشته باشی هزینه زیادی به سیستم وارد میکنی مثلا درنظر بگیر که 1000000 یا بیشتر رکورد داری و هر روز یا هر هفته بیایی و اینا رو از 1 تا آخر مرتب کنی میدونی چه زمان و سرعتی میخواد ؟؟؟؟ و چه فشاری به سیستم ومیاری و برنامه خودت رو سنگین میکنی ؟ اما اگه به جای این برای تعداد از count استفاده کنی در یک لحظه میتونی بدون هیچ مشکلی به تعداد کل دس پیدا کنی
موفق باشی

r0ot$harp
جمعه 14 مرداد 1390, 16:47 عصر
دوست عزیز نمی دونم می خوای چی کار کنی . اما کلا برای این جور کارها در Sql Server باید از Trigger استفاده کنی . به طوری که یه SP می نویسی و توش مشخص می کنی در زمان حذف یا اضافه یا ویرایش یه سری کار رو انجام بده . در کل باید بری سراغ این روش .

باتشکر احسان

badguy
جمعه 14 مرداد 1390, 16:55 عصر
دوستان به هر روشی بخواییم این کار رو انجام بدیم روش پر هزینه ایی خواهد بود, چه با Trigger و چه با Counter چون باز هم مجبور خواهیم شد که یه بار کل دیتا بیس رو مرتب کنیم. [ حالا با دوره های تناوب مرتب سازی مختلف ]