PDA

View Full Version : فیلد AutoNumber در Oracle



Mahyaa
یک شنبه 30 اردیبهشت 1386, 10:24 صبح
سلام

من یک جدول دارم که باید یکی از فیلدهای اون به صورت AutoNumber باشه . Oracle نوع فیلد AutoInc رو مستقیما پشتیبانی نمیکنه .


سوالم اینه که :
آیا کوئری که با تابع Max آخرین مقدار ثبت شده رو بگیره ، میتونه راه حل درست و مناسبی باشه ؟ (از نظر همزمان کار کردن چند نفر باهم)
بهترین راه چیه ؟

پ.ن 1 : با امکان استفاده از Sequence در Oracle آشنا هستم ولی در این جدول خاص نمیخوام از Sequence استفاده کنم .
پ.ن 2 : موضوع نسبتا مرتبط : درج شماره بصورت اتوماتیک (http://www.barnamenevis.org/forum/showthread.php?t=64703&highlight=%CA%98%D1%C7%D1%26%231740%3B)
پ.ن 3 : از کامپوننت ODAC برای اتصال به دیتابیس استفاده میکنم .


ممنون

ghabil
یک شنبه 30 اردیبهشت 1386, 13:00 عصر
راه حل درستت استفاده از Sequence هست ، نمیدونم چرا میگی نمیتونی استفاده کنی؟! راه های دیگه مشکلات خودشون رو دارند.

Mahyaa
یک شنبه 30 اردیبهشت 1386, 13:56 عصر
فکر کنم لازمه یک کمی در مورد جدول مورد نظر توضیح بدم .
در برنامه ی که از این جدول استفاده میکنه ، ممکنه رکوردهایی از جدول Delete بشن . بنابراین بعد از مدتی در فیلد مورد بحث در این جدول ، فواصل خالی خواهیم داشت .
اصلا نمیدونم با این تفاصیل استفاده از اتونامبر درسته یا نه ؟

در مورد استفاده از Sequence ، این اشکال وجود داره که حتی اگر رکورد پاک شده ، آخرین رکورد جدول باشه ، شماره پاک شده برای رکورد بعدی آزاد نمیشه . (همونطور که میدونید سیکونس ها را بعد از ساخته شدن نمیشه مقدار دهی کرد) . به نظرم بهتره که کمترین Gap ممکن رو در این فیلد شمارنده اتوماتیک داشته باشیم . آیا حساسیت در مورد این مساله (کمتر بودن فاصله خالی در شمارنده ) ، بجاست ؟

ببخشید از اینکه انقدر پراکنده نوشتم .

ممنون

ghabil
یک شنبه 30 اردیبهشت 1386, 21:00 عصر
اشتباهی که بعضا دیدم پیش میاد اینکه دوستان فکر میکنند فیلد کلید مورد استفاده برای تعامل با کاربر هم داره ، در حالیکه فیلد کلید هر جدول در مرحله اول برای تشخیص درست هر رکورد در آپدیتها و تغییرات جدول و همینطور ایجاد رابطه بین جداول هست و کلا هم پیشنهاد میشه که بجز در شرایط خاص اصلا کاربر ازش با خبر نباشه و نبیندش و AutoNo بودنش هم بهترین حالت هست و این هم که قابل تکرار نیست و به ازای یک رکورد که حذف میشه نمیشه دوباره شماره قبلی استفاده کرد هم دلیل داره و درست و روی حساب هست و نباید تغییری توش ایجاد کرد و همونطوری هم که میبینید Sequenceها هم در اراکل با این روش تولید میشوند.
اما اگر میخواهید فیلدی مثل کد یا ردیف داشته باشید که به کاربر نشون بدید و کاربر باهاش کا کنه اونوقت میتونید این کد رو در کنار کلید اصلی جدول داشته باشید و به هر روشی که میخواهید تولیدش کنید.
برای اطمینان از همزمانی هم میتونید از Triggerها استفاده کنید.

Mahyaa
دوشنبه 31 اردیبهشت 1386, 09:20 صبح
برای اطمینان از همزمانی هم میتونید از Triggerها استفاده کنید.

آیا استفاده از Sequence به تنهایی کفایت نمیکنه ؟ (یعنی از Trigger استفاده نکنیم)

فرض کنیم در ابتدای یک StoredProcedure که کار Insert رو انجام میده ، بگیم ID رو برابر با عدد بعدی Sequence قرار بده و بعدش ادامه کار برای Insert کردن .
باز هم ریسک همزمانی وجود داره ؟

ghabil
دوشنبه 31 اردیبهشت 1386, 13:04 عصر
نه با استفاده از Sequence هیچ ریسکی وجود نداره ، برای حالتی که میخواهید خودتون یک کد (نه کلید ) درست کنید از Trigger استفاده کنید.