Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में पैरेंट टेबल से पंक्ति डिलीट करने पर FOREIGN KEY का व्यवहार

जब दो टेबल 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
SQLSTATE23000 (इंटीग्रिटी कंस्ट्रेंट वायलेशन)
कंस्ट्रेंट नाम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 फ्लैग) उपयोग करें।

  1. - MySQL में शर्त के आधार पर केवल कुछ पंक्तियां कैसे हटाएं?

    MySQL में DELETE स्टेटमेंट के WHERE क्लॉज का उपयोग करके शर्त के आधार पर केवल विशिष्ट पंक्तियों को हटाया जा सकता है। सिंटैक्स DELETE FROM table_name WHERE condition; उदाहरण तालिका बनाएं: mysql> CREATE TABLE DemoTable (Id INT, Name VARCHAR(20)); mysql> INSERT INTO DemoTable VALUES (100, Bob),

  1. - MySQL में IN() क्लॉज़ के साथ एक क्वेरी में रिकॉर्ड कैसे डिलीट करें?

    MySQL में एक ही क्वेरी में एकाधिक विशिष्ट रिकॉर्ड डिलीट करने के लिए, DELETE स्टेटमेंट के साथ IN() ऑपरेटर का उपयोग करें। यह एकाधिक DELETE स्टेटमेंट चलाने से अधिक कुशल और पठनीय है। उदाहरण: विशिष्ट StudentId वाले रिकॉर्ड डिलीट करना डेमो टेबल बनाएं: mysql> CREATE TABLE DemoTable1922 ( StudentI

  1. - MySQL में डुप्लिकेट डिलीट करके एक पंक्ति कैसे रखें?

    टेम्पररी टेबल विधि CREATE TABLE temp AS SELECT DISTINCT ... से यूनिक रिकॉर्ड कॉपी करें। मूल टेबल TRUNCATE करें। टेम्पररी टेबल से डेटा वापस डालें। टेम्पररी टेबल DROP करें। उदाहरण insert into demo39 values(10,John), (10,John), (11,David), (11,David); डुप्लिकेट हटाने के चरण drop table temporaryT