PDA

View Full Version : سوال: کلید اصلی ممیزی



ozzy_mra
دوشنبه 22 شهریور 1389, 10:11 صبح
سلام
من می خوام کلید اصلی جدولم به صورت مثلاً 18.001 باشه واسه این کار اومدم فیلدم رو decimal(12,3) تعریف کردم ولی دیگه نمی تونم به صورت Identity(1.001,1) تعریفش کنم که به صورت اتومات مقدارش اضافه بشه.
واسه این کار باید چکار کنم؟
مثلاً این کد رو برای ایجاد استفاده میکنم :

create table ab
(
a decimal(18,3) identity(1.001,1) constraint ad primary key,
b nvarchar(15)
)
و این ارور رو میده

Msg 2749, Level 16, State 2, Line 1
Identity column 'a' must be of data type int, bigint, smallint, tinyint, or decimal or numeric with a scale of 0, and constrained to be nonnullable.

ممنون

بهزادصادقی
دوشنبه 22 شهریور 1389, 11:06 صبح
سلام

همانطور که پیغام خطایی که دریافت کرده اید اشاره می کند، مفهوم identity فقط برای ستون هایی که نوعشان از خانواده int هستند قابل تعریف هستند.

به نظر می رسد کاری که شما دنبالش هستید تنها از طریق کد نویسی و استفاده از مفاهیمی به اسم trigger قابل انجام می باشد. آیا می دانید چه جوری از این قابلیت ها استفاده نمائید؟

ozzy_mra
دوشنبه 22 شهریور 1389, 11:13 صبح
سلام

همانطور که پیغام خطایی که دریافت کرده اید اشاره می کند، مفهوم identity فقط برای ستون هایی که نوعشان از خانواده int هستند قابل تعریف هستند.

به نظر می رسد کاری که شما دنبالش هستید تنها از طریق کد نویسی و استفاده از مفاهیمی به اسم trigger قابل انجام می باشد. آیا می دانید چه جوری از این قابلیت ها استفاده نمائید؟

ممنون Insted of Insert باید بنویسم دیگه؟ باید max رو بگیرم و یه دونه اضافه کنم ؟ راه دیگه ای نداره در واقع من می خوام این کدو تو یه برنامه حسابداری استفاده کنم که ارقام بعد از ممیز نمایانگر یه خاصیت هست. والبته باید از Cast هم استفاده کنم که بتونم ممیزشو جدا کنم
به نظر شما این کار بهینه است یا روش بهتری هم وجود داره؟

بهزادصادقی
دوشنبه 22 شهریور 1389, 11:24 صبح
ممنون Insted of Insert باید بنویسم دیگه؟ باید max رو بگیرم و یه دونه اضافه کنم ؟ راه دیگه ای نداره در واقع من می خوام این کدو تو یه برنامه حسابداری استفاده کنم که ارقام بعد از ممیز نمایانگر یه خاصیت هست. والبته باید از Cast هم استفاده کنم که بتونم ممیزشو جدا کنم
به نظر شما این کار بهینه است یا روش بهتری هم وجود داره؟

در وحله اول معمولا استفاده از اعداد حقیقی یا اعشاری برای primary key پیشنهاد نمی شود.

به همچینین، برای ذخیره سازی مفاهیمی مثل شماره حساب ها، معمولا استفاده از دادهای نوع nvarchar پیشنهاد می شود، نه اعداد.

کلا، من پیشنهاد می کنم از مفهوم surrogate key استفاده نمائید. این رویکرد به طراحی داده ها می گوید که کلید های اصلی شما نباید مقدادیر یا مفاهیم یا داده هایی باشند که قابل رویت توسط کاربر هستند. شماره یک حساب قابل رویت توسط کار بر است. بنابرین، امکان دارد که زمانی فرا رسد که کاربر یا مشتری تقاضای تغییر آن را خواهد کرد (مثلا اضافه کردن یا حذف یک نقطه دیگر و یک شماره بعد از آن نقطه). اگر همچین اتفاقی بیاقتد، شما بیچاره خواهید شد. چون کلید اصلی شما برای برقراری ارتباط بین هر حساب با همه جداول دیگر سیستم استفاده شده اند، شما باید هر جا از یک شماره حساب استفاده شده، آن را عوض کنید.

ولی فرض کنید که کلید اصلی شما یک ستون identity است که معنی اش ربطی به شماره حساب ندارد. آن وقت شما می توانید شماره حساب ها را عوض کنید، بدون اینکه تغییری در هیچ داده دیگری بدهید.

ozzy_mra
دوشنبه 22 شهریور 1389, 11:53 صبح
البته کلید اصلی توسط کاربر قابل رویت نیست و در واقع کدی است که به مفسر برنامه ارسال می شود که عملیات متناسب با حساب رو انجام بده
پس پیشنهاد شما همون استفاده از تریگره؟