जब दो टेबल FOREIGN KEY से जुड़े हों और पैरेंट टेबल की पंक्ति डिलीट करने का प्रयास किया जाए जिसका डेटा चाइल्ड टेबल में उपयोग हो रहा हो, तो MySQL एरर 1451 देता है और डिलीट रोक देता है।
उदाहरण सेटअप
customer (पैरेंट) और orders (चाइल्ड) टेबल:
mysql> SELECT * FROM Customer; +----+--------+ | id | name | +----+--------+ | 1 | Gaurav | | 2 | Raman | | 3 | Harshit| | 4 | Aarav | +----+--------+ mysql> SELECT * FROM orders; +----------+----------+------+ | order_id | product | id | +----------+----------+------+ | 100 | Notebook | 1 | | 110 | Pen | 1 | | 120 | Book | 2 | | 130 | Charts | 2 | +----------+----------+------+
डिलीट प्रयास और एरर
mysql> DELETE FROM customer WHERE id = 1; ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`query`.`orders`, CONSTRAINT `orders_ibfk_1` FOREIGN KEY (`id`) REFERENCES `customer` (`id`)) mysql> DELETE FROM customer WHERE id = 2; ERROR 1451 (23000): Cannot delete or update a parent row... -- id=3, 4 डिलीट हो सकते हैं (चाइल्ड में उपयोग नहीं)
एरर विश्लेषण
| घटक | विवरण |
|---|---|
| एरर कोड | 1451 |
| SQLSTATE | 23000 (इंटीग्रिटी कंस्ट्रेंट वायलेशन) |
| कंस्ट्रेंट नाम | orders_ibfk_1 (ऑटो-जेनरेटेड) |
| रेफरेंस | orders.id → customer.id |
समाधान विकल्प
1. पहले चाइल्ड रिकॉर्ड डिलीट करें
DELETE FROM orders WHERE id = 1; DELETE FROM customer WHERE id = 1;
2. ON DELETE CASCADE उपयोग करें (टेबल बनाते समय)
CREATE TABLE orders (
...
FOREIGN KEY (id) REFERENCES customer(id) ON DELETE CASCADE
);
-- पैरेंट डिलीट होने पर चाइल्ड ऑटो-डिलीट
3. ON DELETE SET NULL उपयोग करें
FOREIGN KEY (id) REFERENCES customer(id) ON DELETE SET NULL -- पैरेंट डिलीट होने पर चाइल्ड कॉलम NULL सेट
4. फॉरेन की चेक अस्थायी रूप से अक्षम करें
SET FOREIGN_KEY_CHECKS = 0; DELETE FROM customer WHERE id = 1; SET FOREIGN_KEY_CHECKS = 1;
सिफारिश: एप्लिकेशन लॉजिक में कैस्केड डिलीट या सॉफ्ट डिलीट (is_deleted फ्लैग) उपयोग करें।