View Full Version : سوال در مورد خصوصیت Identity
goodlife
شنبه 01 خرداد 1389, 08:56 صبح
سلام به همه دوستان
اگه فیلدی درون جدولی از نوع Identity تعریف بشه(مثلا ستونی به نام ID)، خب Auto Increase میشه (به صورت خودکار برای هر سطر با توجه به عدد تعیین شده افزایش پیدا میکنه).
حالا زمان پاک شدن یک سطر، خب ID اون منحصر به خودش می مونه و نمیشه دیگه اون رو به سطرهای بعدی اختصاص داد.
.
با وجود این خصوصیت که ID داره، خب مشکلاتی رو ممکنه برای صفحه بندی بوجود بیاره (زمانی که سطرهای زیادی کم و زیاد بشن)
.
آیا میشه کاری کرد که اگه مثلا آخرین سطر پاک شد، ID اون به سطر جدید اختصاص پیدا کنه؟
amir_alaki
شنبه 01 خرداد 1389, 09:24 صبح
با سلام
می شه که خودتون کنترل Insert فیلد Identity رو داشته باشین یعنی Auto Increment قرارش ندین و تو برنامه یا SP کنترل کنین
ولی این وو اصلا توصیه نمی کنم ، چون به شدت حجم عملیات رو زیاد میکنه و برنامه تون رو هم کند می کنه.
شما بهتره روش صفحه بندی تونو عوض کنین
موفق باشید
حسین شهریاری
شنبه 01 خرداد 1389, 09:48 صبح
آیا میشه کاری کرد که اگه مثلا آخرین سطر پاک شد، ID اون به سطر جدید اختصاص پیدا کنه؟
خیر امکانش نیست!!
به قول دوستمون توی پست قبلی شما میتونی خودت این کارا توی برنامتون شبیه سازی کنی یعنی مثلا یه تابع داشته باشی که MAX فیلد ID شما را بگیره و با عدد 1 جمع کنه و شما خروجی اون تابع دا در جدولتون درج کنید.
goodlife
شنبه 01 خرداد 1389, 09:48 صبح
ممنون از پاسخ
خب چه روشی رو برای صفحه بندی پیشنهاد میکنید؟
goodlife
شنبه 01 خرداد 1389, 10:07 صبح
مرسی.
بله این روش هم میشه
اما قصد داشتم که این کارو خود SQL متقبل بشه
در پی این هستم که با استفاده از تراکنش ها این کارو انجام بدم
که نه با استفاده از Max (چرا که این روش در آینده مشکل ساز خواهد بود) بلکه با استفاده از Count خودش یک ID تولید کنه و هنگام اضافه شدن سطر جدید، مقدار را در فیلد ID قرار بده.
از دوستان اگه کسی تجربه این کار رو داره، ممنون میشم اطلاعاتش رو در اختیار من قرار بده.
با سپاس فراوان.
goodlife
شنبه 01 خرداد 1389, 11:02 صبح
من از این کد استفاده کردم،(البته با تراکنش نشد)
زیربرنامه ای دارم که Insert رو انجام میده. من ابتدا تعداد سطرهای موجود را بدست میارم
و سپس به همراه ورودی Insert عمل درج رو انجام میدم:
declare @a int
set @a =(select count(id) from test)
insert into test
values
(
@a,@parameter
(
این تکنیک مشکل نوع Identity رو بر طرف می کنه. و حتی شما می تونید ID سطرهای وسطی که حذف میشه رو داخل یک جدول موقت نگه دارید. هنگام Insert اگر جدول موقت خالی بود خودش ID بسازه و در غیر اینصورت از جدول موقت یک ID به سطر جدید اختصاص بده.
ممنون از همه
محمد سلیم آبادی
شنبه 01 خرداد 1389, 17:24 عصر
declare @a int
set @a =(select count(id) from test)
insert into test
values
(
@a,@parameter
(
به جای کد بالا از این استفاده کنین:
INSERT INTO test
SELECT COUNT(*), @parameter
FROM test
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.