اذهب إلى المحتوى

السؤال

نشر

السلام عليكم
اعمل على مشروع باستخدام php  و قواعد  البيانات mysql
عندي جدولين في كل جدول يوجد Id خاص به و هو AI
استخدمت Id الجدول لربطه بالجدول الاخر من خلال المفتاح الاجنبي و تم الربط بشكل صحيح و الامور تمام
لكن يوجد مشكله عند حذف احدى البيانات في الجدول الاول يتم حذف العنصر في الجدول الثاني المرتبط به من خلال FK
كيف يمكن السماح بالحذف دون حذف العنصر الاخر في الجدول المرتبط به ؟

Recommended Posts

  • 0
نشر

يمكنك اضافة القيد ON DELETE عند إنشاء كل سجل لمفتاح أجنبي، يذكر أن هذا القيد يقبل القيم:

  • CASCADE: أين يتم حذف السجل الابن عند حذف السجل الأب. (مثال: عند حذف الفئة يتم حذف المنتجات التي تنتمي لهاته الفئة).
  • RESTRICT : أين يتم منع حذف السجل الأب عندما يمتلك أي سجل ابن. (مثال: لا يمكن حذف الفئة قبل حذف المنتجات التي تنتمي لهاته الفئة).
  • SET NULL: أين يتم استبدال قيمة FK بـ NULL في الابن عند حذف الأب. (مثال: عند حذف الفئة يتم وضع قيمة NULL للمفاتيح الأجنبية في المنتجات التي تنتمي لهاته الفئة)
  • NO ACTION: أين لن يحدث أي شيء، ويتم رد عملية الحذف. 
  • SET DEFAULT: أين يتم ضبط سجل أب افتراضي في حالة حذف الأب الأصلي. (مثال: عند حذف الفئة "رياضة" يتم وضع قيمة معرف فئة "عام" للمفاتيح الأجنبية في المنتجات التي كانت تنتمي لهاته الفئة "رياضة")

ما تبحث عليه، هو SET NULL أو SET DEFAULT. ففي الأولى نعرف المفاتيح كـ:

CONSTRAINT fk_category_product
    FOREIGN KEY (category_id)
    REFERENCES categories (id)
    ON DELETE SET NULL

أما في الثانية فنعرفها كـ:

category_id INT DEFAULT 1
CONSTRAINT fk_category_product
    FOREIGN KEY (category_id)
    REFERENCES categories (id)
    ON DELETE SET DEFAULT 
  • 0
نشر
بتاريخ 3 ساعة قال Adnane Kadri:

يمكنك اضافة القيد ON DELETE عند إنشاء كل سجل لمفتاح أجنبي، يذكر أن هذا القيد يقبل القيم:

  • CASCADE: أين يتم حذف السجل الابن عند حذف السجل الأب. (مثال: عند حذف الفئة يتم حذف المنتجات التي تنتمي لهاته الفئة).
  • RESTRICT : أين يتم منع حذف السجل الأب عندما يمتلك أي سجل ابن. (مثال: لا يمكن حذف الفئة قبل حذف المنتجات التي تنتمي لهاته الفئة).
  • SET NULL: أين يتم استبدال قيمة FK بـ NULL في الابن عند حذف الأب. (مثال: عند حذف الفئة يتم وضع قيمة NULL للمفاتيح الأجنبية في المنتجات التي تنتمي لهاته الفئة)
  • NO ACTION: أين لن يحدث أي شيء، ويتم رد عملية الحذف. 
  • SET DEFAULT: أين يتم ضبط سجل أب افتراضي في حالة حذف الأب الأصلي. (مثال: عند حذف الفئة "رياضة" يتم وضع قيمة معرف فئة "عام" للمفاتيح الأجنبية في المنتجات التي كانت تنتمي لهاته الفئة "رياضة")

ما تبحث عليه، هو SET NULL أو SET DEFAULT. ففي الأولى نعرف المفاتيح كـ:

CONSTRAINT fk_category_product
    FOREIGN KEY (category_id)
    REFERENCES categories (id)
    ON DELETE SET NULL

أما في الثانية فنعرفها كـ:

category_id INT DEFAULT 1
CONSTRAINT fk_category_product
    FOREIGN KEY (category_id)
    REFERENCES categories (id)
    ON DELETE SET DEFAULT 

شكرا لك ..

مثلا انا عندي جدولين
الجدول الاول هو ( الصنف و ليكن مثلا سيارات )

الجدول الثاني مثلا ( المنتج و عند اضافة منتج جديد يجب ان احدد احد الاصناف لينتمي المنتج لها )

هل يمكن عند حذف الصنف  يبقى كما هو في المنتج . لان الان ينحذف المنتج ايضا بشكل تلقائي

  • 0
نشر
بتاريخ 1 ساعة قال حيدر رزاق:

شكرا لك ..

مثلا انا عندي جدولين
الجدول الاول هو ( الصنف و ليكن مثلا سيارات )

الجدول الثاني مثلا ( المنتج و عند اضافة منتج جديد يجب ان احدد احد الاصناف لينتمي المنتج لها )

هل يمكن عند حذف الصنف  يبقى كما هو في المنتج . لان الان ينحذف المنتج ايضا بشكل تلقائي

نعم، وهو المشروح بالفعل في التعليق السابق.

  • 0
نشر

لمنع حدوث حذف تلقائي للعناصر في الجدول المرتبط عند حذف عنصر في الجدول الأول، يجب تعيين العمليات المتعلقة بالمفتاح الأجنبي (Foreign Key) بشكل صحيح في قاعدة البيانات MySQL. هذا يتطلب استخدام الخاصية ON DELETE وتعيينها إلى RESTRICT أو NO ACTION بدلاً من السلوك الافتراضي الذي هو CASCADE.

 

RESTRICT

CREATE TABLE table1 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    -- other columns
);

CREATE TABLE table2 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    table1_id INT,
    FOREIGN KEY (table1_id) REFERENCES table1(id) ON DELETE RESTRICT,
    -- other columns
);

NO ACTION

CREATE TABLE table1 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    -- other columns
);

CREATE TABLE table2 (
    id INT PRIMARY KEY AUTO_INCREMENT,
    table1_id INT,
    FOREIGN KEY (table1_id) REFERENCES table1(id) ON DELETE NO ACTION,
    -- other columns
);

 

  • 0
نشر
بتاريخ 15 ساعة قال Adnane Kadri:

يمكنك اضافة القيد ON DELETE عند إنشاء كل سجل لمفتاح أجنبي، يذكر أن هذا القيد يقبل القيم:

  • CASCADE: أين يتم حذف السجل الابن عند حذف السجل الأب. (مثال: عند حذف الفئة يتم حذف المنتجات التي تنتمي لهاته الفئة).
  • RESTRICT : أين يتم منع حذف السجل الأب عندما يمتلك أي سجل ابن. (مثال: لا يمكن حذف الفئة قبل حذف المنتجات التي تنتمي لهاته الفئة).
  • SET NULL: أين يتم استبدال قيمة FK بـ NULL في الابن عند حذف الأب. (مثال: عند حذف الفئة يتم وضع قيمة NULL للمفاتيح الأجنبية في المنتجات التي تنتمي لهاته الفئة)
  • NO ACTION: أين لن يحدث أي شيء، ويتم رد عملية الحذف. 
  • SET DEFAULT: أين يتم ضبط سجل أب افتراضي في حالة حذف الأب الأصلي. (مثال: عند حذف الفئة "رياضة" يتم وضع قيمة معرف فئة "عام" للمفاتيح الأجنبية في المنتجات التي كانت تنتمي لهاته الفئة "رياضة")

ما تبحث عليه، هو SET NULL أو SET DEFAULT. ففي الأولى نعرف المفاتيح كـ:

CONSTRAINT fk_category_product
    FOREIGN KEY (category_id)
    REFERENCES categories (id)
    ON DELETE SET NULL

أما في الثانية فنعرفها كـ:

category_id INT DEFAULT 1
CONSTRAINT fk_category_product
    FOREIGN KEY (category_id)
    REFERENCES categories (id)
    ON DELETE SET DEFAULT 

عذرا لم اجد
ON DELETE SET DEFAULT في phpmyadmin

وكذلك لم يتم التنفيذ من خلال اوامر sql

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...