PDA

View Full Version : سوال: چطور برای یک جدول کلید ترکیبی ایجاد کنیم؟



mmbguide
پنج شنبه 27 آذر 1404, 20:56 عصر
سلام. قصد دارم در جدول A مقدار ستون‌های Unit, Line, PartNo منحصربفرد باشند. بنابراین تمام این ستون‌ها را PrimaryKey تعیین کردم. اما مشکلم در استفاده از مقدار کلید در جدول B به عنوان ForeignKey هستش. در جدول B کدام مقدار باید به عنوان مقدار کلید وارد شود؟ اگر ستون Id برای جدول A تعیین کنم و مقدارش AutoNumber باشد بنابراین چون در هر ردیف این مقدار افزایش می‌یابد بنابراین می‌توان یک Unit, Line, PartNo تکراری وارد کرد.

لطفا راهنمایی بفرمایید. آیا باید یک ستون از ترکیب مقادیر Unit, Line, PartNo ایجاد کنم و این ستون را به عنوان تنها ستون PrimaryKey تعیین کنم یا راه حل دیگری هم وجود دارد؟ تشکر

mazoolagh
جمعه 28 آذر 1404, 17:14 عصر
سلام و روز خوش

اگه منظور شما رو درست گرفته باشم :
فیلد ID برای TableA نیاز نیست، یک constraint روی این سه فیلد بسازین و همون رو هم primary key کنین (خودکار unique هم میشه):

156674

یا اگه با SQL DDL راحتترین:
ALTER TABLE TableA
ADD CONSTRAINT TableA_PK PRIMARY KEY (PartNo, Line, Unit)

و relation بین دو جدول رو اینجوری تعریف کنین:

156675

یا باز هم SQL DDL :
ALTER TABLE TableB
ADD CONSTRAINT FK_TableB_TableA
FOREIGN KEY (PartNo, Line, Unit) REFERENCES TableA (PartNo, Line, Unit)
ON UPDATE CASCADE
ON DELETE CASCADE

mmbguide
جمعه 28 آذر 1404, 21:54 عصر
ممنون از لطف شما. بله دنبال همین پاسخ بودم و مشکلم این بود که نمی‌دونستم IndexName باید برای ستون‌های بعدی خالی باشه. علت اینکه نیاز به Id دارم اینه که در جدول B قصد دارم جهت ثبت اطلاعات فقط از یک شناسه واحد (تک ستون) استفاده کنم.

mazoolagh
شنبه 29 آذر 1404, 14:16 عصر
خب شما میتونین به جای این که composite primary key تعریف کنین (همین که بالا گفته شد)
بیاین یک فیلد ID به عنوان primary key به جدول TableA اضافه کنین
ولی همچنان constraint رو روی سه فیلد نگه دارین (اینبار فقط unique)
تا اکسس خودش عملیات چک روی این سه فیلد رو انجام بده ولی بهتره هر سه فیلد رو required هم بکنین.

و این فیلد ID رو با یک فرمولی از روی این سه تا بسازین - مثلا: [PartNo] & "-" & [Line] & "-" & [Unit]
اینجا فرض کردم این سه فیلد string هستن و ممکنه مقادیر non-numeric داشته باشن و ID هم بالطبع باید string باشه
هرچند که بهتره اینها خودشون هم کدگذاری شده باشن (PartNoID, UnitID, LineID)
و ID هم long تعریف بشه، مثلا : [PartNoID]*10000 + [LineID]*100 + [UnitID]

حالا در جدول TableB این فیلد ID رو به عنوان foreign key تعریف کنین.

برای ساختن ID هم کافی هست در before change جدول TableA فیلد ID رو با فرمول مقداردهی کنین (با setfield)

mmbguide
یک شنبه 30 آذر 1404, 22:02 عصر
ممنون از راهنمایی شما