MySQL]: حذف الصفوف من طاولتين المعالين
-
19-09-2019 - |
سؤال
أحاول حذف جميع الصفوف في طاولتين المعالين بناء على معرف الجداول الثالثة.
هيكل الجدول:
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. على قيد مفتاحك الأجنبي