PDA

View Full Version : سوال: مشکل در حذف یک رکورد



aminaltavista
جمعه 03 شهریور 1391, 14:52 عصر
سلام

شاید تکراری باشه اما حقیقت میگم چیزایی که سرچ کردم چرت و پرت بود ! البته جسارت نباشه ها و در حد دکتری صحبت کرده بودند و نفهمیدم!

من از کلید خارجی تو یه جدول استفاده کردم که کلید اصلیش تو یه جدول دیگه هست اما....

موقع حذف یه رکورد که از جدول دارای کلید اصلی هست نمیدونم ! یه خطا میده که ظاهرا منظورشون اینه که کلید خارجی داری و امکان حذفش نیست!

91770

حالا چه طور باید رکورد مورد نظرم رو حذف کنم بدون این که ازم خطا بگیره!

باید ببخشید نمیدونم منظورم رو چه طور برسونم.

siedmohsen
جمعه 03 شهریور 1391, 14:58 عصر
سلام دوست عزیز
چون وقتی شما اون فیلد رو میخواهید پاک کنید اون جدولی که از اون به عنوان کلید خارجی اتفاده میکند نمیگذاره اون پاک بشه


اما راه حل!!1
در ابتدا باید اون فیلد رو از اون جدولی که تو اونجا کلیدخارجی هست پاک کنی( یا اینکه مقدار اون رو یه هنگام سازی کنی )
و پس از اون اون کلید اصلی رو پاک کنی

aminaltavista
جمعه 03 شهریور 1391, 15:40 عصر
اما راه حل!!1
در ابتدا باید اون فیلد رو از اون جدولی که تو اونجا کلیدخارجی هست پاک کنی( یا اینکه مقدار اون رو یه هنگام سازی کنی )
و پس از اون اون کلید اصلی رو پاک کنی

میشه بیشتر توضیح بدید یا یه نمونه بزارید! من تو مفهوم کلید خارجی گیج شدم حتی این نمونه رو هم که انجام دادم صرفا جهت یاد گیری خودم بود که ببینم با کلید خارجی چه کاری انجام میشه یا چه تاثری داره وکی باید ازش استفاده کرد!
ممنون از پاسخ خوبتون

hakim22
شنبه 04 شهریور 1391, 10:22 صبح
مثلا شما چند تا مشتری دارید که هر مشتری چندین بار خرید کرده
ممکنه 10 تا مشتری باشه ولی 1000 تا فاکتور خرید وجود داشته باشه

برای اینکه مشخص بشه هر خرید به کدوم مشتری مربوط میشه شما یک ارتباط (Relation) بین لیست فاکتورهای خرید و لیست مشتری ها ایجاد می کنید
اینکارو معمولا با اضافه کردن یک ستون مثل CustomerID در جدول فاکتور های خرید انجام میدهند.

SQL server این نوع ارتباط ها رو با پیشوند FK که به معنی Foreign Key یا همون کلید خارجی مشخص میکنه.
حالا اینکه دقیقا کلید داخلی و خارجی چه فرقهایی دارند برای حل مشکل شما اهمیت نداره

مشکل شما از اینجا ناشی میشه که میخواهید یک مثلا یک مشتری رو حذف کنید. در حالی که در یک لایه پایینتر اون مشتری ممکنه چندین رکورد خرید به نامش ثبت شده باشه
اگر مشتری پاک بشه رکوردهای زیرین نافص میشوند و به همین دلیل SQL به صورت پیشفرض اجازه ی چنین کاری رو به شما نمیده
راه اول اینه که همیشه قبل از پاک کردن داده های لایه های بالاتر داده های لایه های پایینتر مربوط بهش رو پاک کنید.
در اینجا شما باید اول همه ی خریدهای یک مشتری رو حذف کنید بعد خود مشتری رو حذف کنید.

راه دوم :
در SQL یک تنظیم وجود داده که اینکار رو به صورت خودکار مدیریت میکنه و خودش زنجیر وار همه ی داده های زیرین مربوط به یک رکورد رو پاک میکنه
به قسمت Constrains در رو یک جدول بروید و گزینه های Cascade رو فعال کنید.

در خیلی موارد بهتره دستی مدیریت کنید. چون واقعا کنترل اینکه چه داده هایی ممکنه از دست بره خیلی مشکل میشه در حالت اتوماتیک.
در عوض اینکار باعث میشه فیلدهای زیادی Null بشوند که مجبورید با استفاده از برنامه نویسی پیداشون کنید و پاکشون کنید.