Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

MySQL की INSERT IGNORE INTO और विदेशी कुंजियाँ

[नया उत्तर]

इसे लाने के लिए @NeverEndingQueue को धन्यवाद। ऐसा लगता है कि MySQL ने आखिरकार इस मुद्दे को ठीक कर दिया है। मुझे यकीन नहीं है कि इस समस्या को पहले किस संस्करण में ठीक किया गया था, लेकिन अभी मैंने निम्नलिखित संस्करण के साथ परीक्षण किया है और समस्या अब और नहीं है:

mysql> SHOW VARIABLES LIKE "%version%";
+-------------------------+------------------------------+
| Variable_name           | Value                        |
+-------------------------+------------------------------+
| innodb_version          | 5.7.22                       |
| protocol_version        | 10                           |
| slave_type_conversions  |                              |
| tls_version             | TLSv1,TLSv1.1                |
| version                 | 5.7.22                       |
| version_comment         | MySQL Community Server (GPL) |
| version_compile_machine | x86_64                       |
| version_compile_os      | Linux                        |
+-------------------------+------------------------------+

स्पष्ट होना:

mysql> INSERT IGNORE INTO child
    -> VALUES
    ->     (NULL, 1)
    ->     , (NULL, 2)
    ->     , (NULL, 3)
    ->     , (NULL, 4)
    ->     , (NULL, 5)
    ->     , (NULL, 6);
Query OK, 4 rows affected, 2 warnings (0.03 sec)
Records: 6  Duplicates: 2  Warnings: 2

इस अंतिम प्रश्न के अर्थ को बेहतर ढंग से समझने के लिए और यह क्यों दिखाता है कि समस्या ठीक हो गई है, कृपया नीचे दिए गए पुराने उत्तर को जारी रखें।

[पुराना उत्तर]

मेरा समाधान समस्या का समाधान है और वास्तविक समाधान हमेशा समस्या को MySQL के भीतर ही ठीक करना होगा।

निम्नलिखित चरणों ने मेरी समस्या का समाधान किया:

ए. निम्नलिखित टेबल और डेटा रखने पर विचार करें:

mysql>
CREATE TABLE parent (id INT AUTO_INCREMENT NOT NULL
                     , PRIMARY KEY (id)
) ENGINE=INNODB;

mysql>
CREATE TABLE child (id INT AUTO_INCREMENT
                    , parent_id INT
                    , INDEX par_ind (parent_id)
                    , PRIMARY KEY (id)
                    , FOREIGN KEY (parent_id) REFERENCES parent(id)
                        ON DELETE CASCADE
                        ON UPDATE CASCADE
) ENGINE=INNODB;

mysql>
INSERT INTO parent
VALUES (NULL), (NULL), (NULL), (NULL), (NULL), (NULL);

mysql>
SELECT * FROM parent;
+----+
| id |
+----+
|  1 |
|  2 |
|  3 |
|  4 |
|  5 |
|  6 |
+----+

ख. अब हमें समस्या को प्रदर्शित करने के लिए कुछ पंक्तियों को हटाना होगा:

mysql>
DELETE FROM parent WHERE id IN (3, 5);

<मजबूत>सी. समस्या: समस्या तब उत्पन्न होती है जब आप निम्न चाइल्ड पंक्तियों को सम्मिलित करने का प्रयास करते हैं:

mysql>
INSERT IGNORE INTO child
VALUES
    (NULL, 1)
    , (NULL, 2)
    , (NULL, 3)
    , (NULL, 4)
    , (NULL, 5)
    , (NULL, 6);

ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint f
ails (`test`.`child`, CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERE
NCES `parent` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

mysql>
SELECT * FROM child;
Empty set (0.00 sec)

भले ही IGNORE कीवर्ड का उपयोग किया जाता है, लेकिन MySQL अनुरोधित ऑपरेशन को रद्द कर देता है क्योंकि उत्पन्न त्रुटि चेतावनी में नहीं बदली जाती है (जैसा कि इसे माना जाता है)। अब जबकि समस्या स्पष्ट है, आइए देखें कि हम बिना किसी त्रुटि का सामना किए स्टेटमेंट में अंतिम इंसर्ट कैसे निष्पादित कर सकते हैं।

<मजबूत>डी. समाधान: मैं इन्सर्ट को कुछ अन्य स्थिर स्टेटमेंट्स द्वारा स्टेटमेंट में लपेटने जा रहा हूँ जो न तो डाले गए रिकॉर्ड्स पर निर्भर हैं, न ही उनकी संख्या पर।

mysql>
SET FOREIGN_KEY_CHECKS = 0;

mysql>
INSERT INTO child
VALUES
    (NULL, 1)
    , (NULL, 2)
    , (NULL, 3)
    , (NULL, 4)
    , (NULL, 5)
    , (NULL, 6);

mysql>
DELETE FROM child WHERE parent_id NOT IN (SELECT id FROM parent);

mysql>
SET FOREIGN_KEY_CHECKS = 1;

मुझे पता है कि यह इष्टतम नहीं है, लेकिन जब तक MySQL ने समस्या को ठीक नहीं किया है, यह सबसे अच्छा मुझे पता है। खासकर जब से सभी कथनों को एक अनुरोध में निष्पादित किया जा सकता है यदि आप PHP में mysqli लाइब्रेरी का उपयोग करते हैं।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PHP Mysql PDO बाध्य चर की संख्या टोकन की संख्या से मेल नहीं खाती

  2. mysql डेटाटाइप केवल महीने और साल स्टोर करने के लिए

  3. GRANT MySQL में काम क्यों नहीं कर रहा है?

  4. MySQL वर्तमान डेटा को योग करने के लिए फ़ंक्शन का चयन करें

  5. MySQL VARCHAR अधिकतम आकार क्या है?