ورود

View Full Version : اگر دو فیلد کلید اصلی را تشکیل بدهند، می توان مقدار کلید اصلی را تغییر داد؟



اوبالیت به بو
پنج شنبه 19 بهمن 1391, 16:02 عصر
درود بر شما

فرض کنید دو فیلد A و B داریم.

فیلد B کلید خارجی جدول ماست.
فیلدهای A و B را به صورت کلید ترکیبی در نظر گرفته ایم.

حال در سیستم می خواهم ویرایش انجام دهم و مقدار فیلد A و B آن را رکورد را تغییر دهم. آیا امکان پذیر خواهد بود؟

محمد سلیم آبادی
پنج شنبه 19 بهمن 1391, 21:20 عصر
حال در سیستم می خواهم ویرایش انجام دهم و مقدار فیلد A و B آن را رکورد را تغییر دهم. آیا امکان پذیر خواهد بود؟
چرا امکان پذیر نباشه؟ ولی باید توجه داشته باشین که ترکیب دو مقدار مذکور بعد از ویرایش تکراری نباشد. چرا که ستون primary key منحصر بفرد است.

sina_rzv2
شنبه 21 بهمن 1391, 10:15 صبح
درود بر شما

فرض کنید دو فیلد A و B داریم.

فیلد B کلید خارجی جدول ماست.
فیلدهای A و B را به صورت کلید ترکیبی در نظر گرفته ایم.

حال در سیستم می خواهم ویرایش انجام دهم و مقدار فیلد A و B آن را رکورد را تغییر دهم. آیا امکان پذیر خواهد بود؟


باید هنگام ساخت جدول کد :
on Update cascade
را بزنید در این صورت هر تغییری تو فیلد A بدهید در فیلد B هم تغییر می کند وبالعکس
اگر جدول را قبلاً ساختید وارد قسمت Design شوید، کلید راست کنید، Relationship را بزنید، در قسمت insert and update special باید Update rule را از حالت no action به cascade تغییر دهید

اوبالیت به بو
شنبه 05 اسفند 1391, 11:47 صبح
چرا امکان پذیر نباشه؟ ولی باید توجه داشته باشین که ترکیب دو مقدار مذکور بعد از ویرایش تکراری نباشد. چرا که ستون primary key منحصر بفرد است.

درود بر شما

بالاخره به نقطه ای رسیدم که به این مشکل بر خوردم.

در کنترل کردن این قسمت به مشکل بر خوردم. کاربر در بخش ویرایش باید بتونه مقادیر ستون A و B رو تغییر بده. حالا فرض کنید یک ستون سومی وجود داره به نام Title که یک اسمی وارد میشه. حالا اگر کاربر نخواست ستون A و B رو تغییر بده اما خواست Title رو تغییر بده به مشکل بر می خورم چون در شرط مورد نظر غیرتکراری بودن A و B مد نظر بوده:


ALTER Procedure [dbo].[sp_Stations_SelectByAreaIDAndStationID]
@Area_ID int,
@StationID int
As
Begin
Select
[ID],
[Area_ID],
[StationID],
[Title]
From Stations
Where
[Area_ID] = @Area_ID
AND
[StationID] = @StationID
Order By [Area_ID],[StationID] ASC
End


Area_ID ستون A و StationID ستون B. ستون A کلید خارجی می باشد. تابع فوق اگر رکوردی وجود داشته باشد آن را برگشت می دهد لذا ما متوجه می شویم که باید پیغام خطا صادر کنیم. اما از طرفی نباید صادر کنیم!! چون کاربر نمی خواد ستون A و B رو تغییر بده.

در بخش ویرایش فرض کنید که مقادیر این ستون ها رو نمی خواد تغییر بده اما عمل ویرایش انجام شود. یعنی یک پیغام Successfully دریافت نماید.

veniz2008
شنبه 05 اسفند 1391, 23:53 عصر
سلام.
چندتا بحث وجود داره. یکی بحث کلید خارجی بودن ستون A . در اینحالت حتی اگر مقدار A و B با هم یک ترکیب جدید باشن ولی A در جدول مبدا ( همون جدولی که به عنوان کلید اصلی تعریف شده) نباشه باز هم خطا صادر میشه. پس باید این دو شرط حتما با هم وجود داشته باشن (یعنی and هستن): 1. ترکیب A و B یک ترکیب جدید باشه. 2. فیلد A درون جدول مبدا وجود داشته باشه.
اما بریم سراغ ویرایش کردن : معمولا در یک طراحی اصولی کلید رو دست نمیزنن بلکه صفت های متعلق به اون کلید رو ویرایش میکنن. مثلا در سیستم دانشجویی، شماره دانشجویی دست نمیخوره ولی ممکنه نام، نام خانوادگی، تاریخ تولد، آدرس و ... تغییر داشته باشن. کلید معمولا بارها در جداول دیگه تکرار میشه و تغییر کلید اگر بدقت کنترل نشه میتونه کل برنامه رو بهم بریزه. بنابراین مدیریت کردنش هم با توجه به گستردگی برنامه پیچیده تر میشه.