دوستان من تو دیتابیس خودم یک primery key دارم که auto number هست.حالا وقتی یک ردیفی از این جدول حذف میشه ،میخوام اون فیلد اتونامبر من خودش تشخیص بده و مثلا اگر ردیف 9 حذف شده ، ردیف 10 بیاد جاش و یک ردیف خالی وجود نداشته باشه.یعنی از آخر کم بشه.
دوستان من تو دیتابیس خودم یک primery key دارم که auto number هست.حالا وقتی یک ردیفی از این جدول حذف میشه ،میخوام اون فیلد اتونامبر من خودش تشخیص بده و مثلا اگر ردیف 9 حذف شده ، ردیف 10 بیاد جاش و یک ردیف خالی وجود نداشته باشه.یعنی از آخر کم بشه.
من مدت ها این مشکل رو داشتم ولی در آخر به این نتیجه رسیدم که هیچ راهی درستی برای این موضوع نیست ولی چند تا روش دور زدن ارائه دادن که نظر شخصی من نیست
از این روش می توانید برای 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- تولید یک فیلد جدید با امکان افزایش خودکار با همان نام
یا علی
چه لزومی داره که این کارو کنی؟ تو میتونی هر کاری رو که دلت میخواد!! با همین Primary Key های نامرتب انجام بدی!!
در ضمن وقتی حجم دیتا بیست زیاد شه مشکلات جدی خواهی داشت!
اگه سرعت و درگیر بودن CPU & I/O برات مهم نیس روش بالا روش خوبی به نظر میرسه ولی اگه قراره با حجم بالایی از دیتا ها کار کنی و 100% اصرار داری که این کارو کنی اون وقت باید وقت بذاری و یه Custom SQL متناسب با نیاز های خودت بنویسی!!
موفق باشی
فکر نمیکرم انقدر پیچیده باشه.گفتم شاید خود sql server امکانی داشته باشه که شماره ها رو خودش ترتیب بده.خیلی هم ضایعه هستش.چون مثلا از شماره 8 میپره رو 10 .این فیلد هم فقط برای شمارش رکوردها استفاده میشه.نیازی به ثابت بودن شماره ها نیست.
نه اشتباه نکن این فیلد یه Primary Key هستش و برایه یگانه سازی رکورد ها در دیتا بیس استفاده میشن! مثل شماره شناسنامه ی آدما مثلا وقتی یه نفر میمره(حدف میشه) آیا شماره شناسنامه ها ریست میشن؟؟
اگه میخوای تعداد رکورد ها رو بدونی از تابع Count [ بسته به نوع دیتا بیس ] استفاده کن.
فک کنم برا این میخوای این Primary key ها ریست شن برا اینکه در به جدول یا یه همچین چیزی نشون بدی؟ اگه به این منظور باشه اینجا یه Counter میذاری که به ازای هر رکورد Counter+=1 میشه اینجوری میتونی از همون چیزی که میگی " از 8 میپره به 10 " در ظاهر کار خلاص شی!
موفق باشی
آخرین ویرایش به وسیله mehdi.mousavi : شنبه 15 مرداد 1390 در 12:34 عصر دلیل: ادغام دو پست متوالی
یه سوال میخوای با اینا چکار کنی که این همه اصرار بر ریست داری؟ ( واقعا جایه سوال شد از این همه اصرار!!! )
تو حتی میتونی یه فیلد مخصوص به این کار رو اصلا ایجاد کنی! هدفت از این کار چیه؟
سلام دوست عزیز
این کار به هیچ عنوان کار خوبی نیست و پیشنهاد میکنم دنبال این کار نرو بجای این که بخوایی اینو ریست کنی بهتره که یک ستون به بانک اضافه کنی مثلا با نام شماره که در اون از یک شروع کنی به شماره گذاری و وقتی که میخوای فیلیدی رو اضافه کنی بیایی بری توی اون ستون و آخرین عدد رو بخونی و با 1 جمع کنی و ثبت کنی که البته باز هم اگر از وسط چیزی رو پاک کنی با همین مشکل روبرو میشی اما برای رفع این مشکل میتونی در کد هات قرار بدی که هر روز یا هر هفته و... بیاد و این ستون رو از 1 تا آخر درست کنه باز این بهتر از اینه که بیایی و کلید اصلی رو تغییر بدی و البته باید این رو هم بگم که اگه تعدادشو میخوایی همن جور که دوستمون گفت از count استفاده کن و درکل از این فکر بیا بیرون چون درصورتی که شما رکورد های زیادی داشته باشی هزینه زیادی به سیستم وارد میکنی مثلا درنظر بگیر که 1000000 یا بیشتر رکورد داری و هر روز یا هر هفته بیایی و اینا رو از 1 تا آخر مرتب کنی میدونی چه زمان و سرعتی میخواد ؟؟؟؟ و چه فشاری به سیستم ومیاری و برنامه خودت رو سنگین میکنی ؟ اما اگه به جای این برای تعداد از count استفاده کنی در یک لحظه میتونی بدون هیچ مشکلی به تعداد کل دس پیدا کنی
موفق باشی
دوست عزیز نمی دونم می خوای چی کار کنی . اما کلا برای این جور کارها در Sql Server باید از Trigger استفاده کنی . به طوری که یه SP می نویسی و توش مشخص می کنی در زمان حذف یا اضافه یا ویرایش یه سری کار رو انجام بده . در کل باید بری سراغ این روش .
باتشکر احسان
دوستان به هر روشی بخواییم این کار رو انجام بدیم روش پر هزینه ایی خواهد بود, چه با Trigger و چه با Counter چون باز هم مجبور خواهیم شد که یه بار کل دیتا بیس رو مرتب کنیم. [ حالا با دوره های تناوب مرتب سازی مختلف ]
آخرین ویرایش به وسیله mehdi.mousavi : شنبه 15 مرداد 1390 در 12:35 عصر دلیل: حذف موارد غیر فنی پست!