ورود

View Full Version : حذف یا آپدیت یک سطر در دو جدول مرتبط



bftarane
دوشنبه 16 اردیبهشت 1392, 19:27 عصر
سلام.
فرض کنید دو تا جدول داریم به اسم user با فیلدهای
id از نوع identity و کلید اولیه
name
و یک جدول دیگه به اسم userprofile با فیلدهای
id (کلید خارجی)
age
که این کلید خارجی همون کلید اولیه در جدول user هست
حالا برای Update و Delete چه روشی مناسب هست؟
من خودم به نظرم می رسه از Transaction استفاده بشه و مثلاً 2 تا update یا 2 تا Delete پشت سر هم در این Transaction نوشته بشه. نمی دونم راه خوبیه یا راه بهتری وجود داره؟

veniz2008
دوشنبه 16 اردیبهشت 1392, 22:09 عصر
سلام.
اگر در ویرایش جدول user دست به مقدار کلید نمیزنید پس این تغییر به جدول دوم تزریق نمیشه و نیازی نیست برای update کاری کنید ولی اگر بروزرسانی شامل کلید هم ممکنه بشه (یعنی کلید اصلی رو ممکنه که ویرایش کنید) اونموقع update و delete وضعیت مشابهی رو دارند.
برای این کار کافیه که برای Delete و Update خاصیت DeleteRule یا UpdateRule رو بر روی cascade قرار بدید. این خصوصیت به شما امکان میده که با حذف کلید اصلی در جدول user ، بصورت اتوماتیک تمامی کلیدهای خارجی اون حذف بشن. بعبارت ساده تر در این حالت به جای اینکه برنامه نویس درگیر حذف کلید خارجی بشه، خود sql مدیریت این کار رو با توجه به ارتباط های جدولتون بر عهده میگیره و نیازی به کدنویسی شما نیست.
عکس زیر روند کار رو نشون میده :

103796

bftarane
سه شنبه 17 اردیبهشت 1392, 12:38 عصر
متشکرم.
خیلی خوب بود توضیحتون.
ولی من چون در مورد join در update و delete شنیده بودم می خوام بدونم آیا در این مورد خاص که در پست اول گفتم در sp از Transaction استفاده کنم یا از join استفاده کنم؟

veniz2008
سه شنبه 17 اردیبهشت 1392, 19:35 عصر
اگر قصد استفاده از ویزارد رو ندارید به نظرم بهترین کار همون Transaction هست.
ببینید join در Update و delete به درد مواقعی میخوره که میخواید بر روی یک جدول و از روی یک جدول دیگه اعمال تغییرات بدید. مثلا میخوایم رکوردهایی رو از جدول وابسته (شامل کلید خارجی) حذف یا ویرایش کنیم که نمونه مشابهش در جدول اصلی وجود داره و معمولا این تغییرات به محوریت کلید و نه بر روی خود کلید انجام میشه (فیلدهی وابسته به اون کلید رو دستخوش تغییرات میکنیم و با خود کلید معمولا کاری نداریم). در این حالت فقط جدول وابسته تغییر میکنه و جدول اصلی همچنان مثل سابق باقی خواهد بود. ولی هدف شما اینه که تغییرات همزمان بر روی دو جدول و بر روی کلید انجام بشه. پس join در اینجا عملا مفید نخواهد بود. پس بهتر همونه که با دوکوئری ساده در داخل یک transaction عمل مورد نظرتون رو پیاده سازی کنید یا اینکه مدیریت کار رو به Sql بسپارید (طبق پست بالایی که توضیح دادم).
موفق باشید.