سؤال

أحاول حذف جميع الصفوف في طاولتين المعالين بناء على معرف الجداول الثالثة.

هيكل الجدول:

Transaction
-Transaction_ID (primary)
-Timestamp

Purchase
-Item_ID
-Transaction_ID
-Purchase_ID (primary)

Item
-Item_ID (primary)
-Client_ID

أرغب في حذف جميع الصفوف من المعاملة / الشراء التي تتطابق مع العميل_ID في البند. يبدو بسيطا بما فيه الكفاية ... حتى أتمكن من لف العقل المبتدئ في ذلك ...

DELETE dbName.t FROM
  dbName.Transaction t
JOIN
  dbName.Purchase p
 ON
  p.Transaction_ID = t.Transaction_ID
JOIN
  dbName.Item i
 ON
  p.Item_ID = i.Item_ID
WHERE
  Client_ID = 1

لا...

أحصل على هذا الخطأ foreign key constraint fails... - أنا متأكد من أن الكثير منكم لا يفاجأون.

هي القضية التي يستخدمها الشراء T.Transaction_id؟ - (هكذا، سيفشل هذا المفتاح الأجنبي)

أو هل من المحتمل أن تكون هناك بيانات T.Transaction_ID الأخرى في هذا الجدول (لم أجد أي).

تعديل: COMPLETE ERROR

Cannot delete or update a parent row: a foreign key constraint fails
(`ItemTracker_dbo/Purchase`, CONSTRAINT `FK_Purchase_Transaction`  
FOREIGN KEY (`Transaction_ID`) REFERENCES `Transaction` (`Transaction_ID`) 
ON DELETE NO ACTION ON UPDATE CASCADE)
هل كانت مفيدة؟

المحلول

لا يمكنك حذف من جدول طالما أن السجلات المعتمدة لا تزال موجودة في جدول آخر. في حالتك، يذهب التبعية مثل هذا

Transaction <- Purchase -> Item

لذلك تحتاج إلى حذف أي مشتريات أولا قبل أن تتمكن من حذف المعاملات.

كبديل لهذا النهج من خطوتين، أود أن أوصي بإعداد ON DELETE CASCADE قيد وتذهب مع هذا:

DELETE 
  Transaction 
WHERE 
  Transaction_ID IN (
    SELECT 
      Transaction_ID 
    FROM
      Purchase INNER JOIN Item ON Item.Item_ID = Purchase.Item_ID
    WHERE
      Item.Client_ID = <your Client ID here>
  )

احذر أن هذا حذف أي Transaction (ومن خلال Cascade، أي Purchase) حيث يوجد اعتماد Item مع مطابقة Client_ID, ، بغض النظر عما إذا كان هناك أي آخر البنود فيه. إذا لم يكن هذا ما تريده، فسيحتاج السؤال إلى المكرر.

نصائح أخرى

Transaction <- Purchase -> Item

مشكلتك هي أنك تحاول حذف المعاملة قبل حذف عملية الشراء، والطريقة الصحيحة للقيام بها هي حذف عملية الشراء وبعد ذلك فقط المعاملة، أو التي يمكنك استخدامها على حذف cascade. على مفاتيحك الأجنبية، يبدو أنك تستخدم على حذف تقييد.

انظر هنا: http://dev.mysql.com/doc/refman/5.0/es/innodb-fiengey-constraints.html.html

بالإضافة إلى ذلك، إذا لم تكن متأكدا من أن هذا هو السبب في أنه يجب عليك إعطاء الخطأ الكامل، فإن DBMS يخبرك عادة ما يخالف المفتاح الأجنبي الخطأ.

تحديث: أوضح الخطأ الخاص بك، المشكلة هي أنك تحذف عملية الشراء أولا ثم المعاملة، تحتاج إلى القيام بذلك إلى الوراء أو مجموعة على حذف cascade. على قيد مفتاحك الأجنبي

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top