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

MySQL में सबक्वेरी से SELECT करके फिर DELETE कैसे करें?

MySQL में सबक्वेरी के परिणाम के आधार पर पंक्तियाँ डिलीट करने के लिए, DELETE ... WHERE IN (subquery) पैटर्न का उपयोग करें। MySQL में उसी टेबल को सीधे सबक्वेरी में संदर्भित नहीं कर सकते, इसलिए डिराइव्ड टेबल (उपनाम के साथ) का उपयोग करना आवश्यक है।

उदाहरण: पहले 3 रिकॉर्ड डिलीट करना (Id द्वारा क्रमबद्ध)

डेमो टेबल बनाएं:

mysql> CREATE TABLE DemoTable1947 (
    Id INT,
    Name VARCHAR(20)
);

डेटा इन्सर्ट करें:

mysql> INSERT INTO DemoTable1947 VALUES
(101, 'Chris'), (102, 'David'), (103, 'Mike'), (104, 'Bob'), (105, 'Sam');

डेटा:

+------+-------+
| Id   | Name  |
+------+-------+
| 101  | Chris |
| 102  | David |
| 103  | Mike  |
| 104  | Bob   |
| 105  | Sam   |
+------+-------+

सबक्वेरी के साथ डिलीट (पहले 3 Id):

mysql> DELETE FROM DemoTable1947
WHERE Id IN (
    SELECT * FROM (
        SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3
    ) AS t
);

आउटपुट: Query OK, 3 rows affected

शेष डेटा:

+------+------+
| Id   | Name |
+------+------+
| 104  | Bob  |
| 105  | Sam  |
+------+------+

महत्वपूर्ण: डिराइव्ड टेबल (उपनाम 't') आवश्यक है

MySQL नहीं अनुमति देता:

-- एरर: You can't specify target table 'DemoTable1947' for update in FROM clause
DELETE FROM DemoTable1947 WHERE Id IN (SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3);

समाधान: सबक्वेरी को डिराइव्ड टेबल में लपेटें:

DELETE FROM DemoTable1947
WHERE Id IN (SELECT * FROM (SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3) AS t);

वैकल्पिक: JOIN के साथ DELETE (अक्सर तेज़)

DELETE d
FROM DemoTable1947 d
JOIN (
    SELECT Id FROM DemoTable1947 ORDER BY Id LIMIT 3
) t ON d.Id = t.Id;

अन्य सामान्य पैटर्न

डुप्लिकेट रखते हुए पहली पंक्ति डिलीट करें

DELETE t1 FROM table t1
JOIN table t2 ON t1.dup_col = t2.dup_col AND t1.id > t2.id;

पुराने रिकॉर्ड डिलीट करें (बैच में)

DELETE FROM logs
WHERE id IN (
    SELECT * FROM (SELECT id FROM logs WHERE created_at < '2023-01-01' LIMIT 1000) AS t
);

सावधानियां

  • बैकअप: बड़े DELETE से पहले बैकअप लें
  • ट्रांजैक्शन: स्पष्ट ट्रांजैक्शन में चलाएं
  • लॉक: बड़ी डिलीट टेबल लॉक कर सकती है; बैच में करें
  • विदेशी कुंजी: ON DELETE CASCADE/SET NULL/RESTRICT व्यवहार जांचें

डिराइव्ड टेबल ट्रिक MySQL की एक ज्ञात सीमा का समाधान है और DELETE/UPDATE सबक्वेरी के लिए मानक पैटर्न है।

  1. - MySQL सबक्वेरी को FROM क्लॉज में कैसे उपयोग करें?

    सबक्वेरी को FROM क्लॉज में एक डेराइव्ड टेबल (वर्चुअल टेबल) के रूप में उपयोग किया जा सकता है। इसे इनलाइन व्यू भी कहते हैं। सिंटैक्स: SELECT ... FROM (subquery) [AS] name ... नोट: डेराइव्ड टेबल के लिए एलियास (AS name) अनिवार्य है। उदाहरण - cars टेबल: Select * from Cars; +------+--------------+----

  1. MySQL से अंतिम 10 रो कैसे चुनें? MySQL से अंतिम 10 रो कैसे चुनें?

    MySQL से अंतिम 10 रो चुनने के लिए, हम SELECT स्टेटमेंट और LIMIT कॉन्सेप्ट के साथ सबक्वेरी का उपयोग कर सकते हैं। निम्न एक उदाहरण है। टेबल बनाना। mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected (0.75 sec) टेबल में रिकॉर

  1. - MySQL में INSERT INTO SELECT और UNION के साथ एकाधिक इन्सर्ट कैसे करें?

    MySQL में एक ही स्टेटमेंट में एकाधिक पंक्तियाँ इन्सर्ट करने के लिए, INSERT INTO ... SELECT के साथ UNION ALL (या UNION) का उपयोग करें। यह अलग-अलग INSERT स्टेटमेंट से अधिक कुशल है। सिंटैक्स INSERT INTO table_name (col1, col2, col3) SELECT val1, val2, val3 UNION ALL SELECT val4, val5, val6 UNION ALL S