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

MySQL ERROR 1093 ठीक करें: सबक्वेरी में FROM क्लॉज के साथ DELETE के लिए डिराइव्ड टेबल उपयोग करें

MySQL में उसी टेबल से चयन करके हटाने पर ERROR 1093 (HY000): You can't specify target table for update in FROM clause त्रुटि होती है। समाधान: सबक्वेरी को डिराइव्ड टेबल (उपनाम के साथ) में लपेटें।

समस्या

mysql> DELETE FROM DemoTable WHERE Marks = (SELECT MIN(Marks) FROM DemoTable);
ERROR 1093 (HY000): You can't specify target table 'DemoTable' for update in FROM clause

समाधान: डिराइव्ड टेबल (उपनाम आवश्यक)

DELETE FROM DemoTable
WHERE Marks = (
    SELECT lowestMarks FROM (
        SELECT MIN(Marks) AS lowestMarks FROM DemoTable
    ) AS deleteRecord
) LIMIT 1;

उदाहरण

1. टेबल बनाएं

mysql> CREATE TABLE DemoTable1597 (Marks INT);

2. डेटा डालें

mysql> INSERT INTO DemoTable1597 VALUES(45), (59), (43), (85), (89);

3. न्यूनतम मान वाली एक पंक्ति हटाएं

mysql> DELETE FROM DemoTable1597
    -> WHERE Marks = (
    ->     SELECT lowestMarks FROM (
    ->         SELECT MIN(Marks) AS lowestMarks FROM DemoTable1597
    ->     ) AS deleteRecord
    -> ) LIMIT 1;

4. परिणाम

mysql> SELECT * FROM DemoTable1597;
+-------+
| Marks |
+-------+
| 45    |
| 59    |
| 85    |
| 89    |
+-------+

न्यूनतम मान 43 वाली पंक्ति हटा दी गई।

क्यों काम करता है

  • आंतरिक सबक्वेरी MIN(Marks) की गणना करती है
  • मध्यवर्ती डिराइव्ड टेबल AS deleteRecord परिणाम को भौतिकीकृत करती है
  • बाहरी सबक्वेरी डिराइव्ड टेबल से पढ़ती है (मूल टेबल नहीं)
  • MySQL को लगता है अलग टेबल से पढ़ रहे हैं

अन्य समाधान

JOIN के साथ (MySQL-विशिष्ट)

DELETE t1 FROM DemoTable1597 t1
JOIN (SELECT MIN(Marks) AS min_mark FROM DemoTable1597) t2
ON t1.Marks = t2.min_mark
LIMIT 1;

MySQL 8.0+: CTE

WITH min_val AS (SELECT MIN(Marks) AS min_mark FROM DemoTable1597)
DELETE FROM DemoTable1597
WHERE Marks = (SELECT min_mark FROM min_val)
LIMIT 1;

बहु-टेबल DELETE सिंटैक्स

DELETE t1 FROM DemoTable1597 t1
INNER JOIN (SELECT MIN(Marks) AS min_mark FROM DemoTable1597) t2
ON t1.Marks = t2.min_mark
LIMIT 1;

LIMIT 1 का महत्व

डुप्लिकेट न्यूनतम मान होने पर केवल एक पंक्ति हटाने के लिए।

  1. - MySQL में यूजर-डिफाइंड वेरिएबल में SUM स्टोर करके अंतिम कॉलम मान के रूप में प्रदर्शित करना

    यूजर-डिफाइंड वेरिएबल के साथ SUM को अंतिम पंक्ति में अपडेट करना कुल योग को एक वेरिएबल में स्टोर करें और फिर UPDATE कमांड का उपयोग करके इसे अंतिम पंक्ति में सेट करें। आइए पहले एक टेबल बनाते हैं: mysql> CREATE TABLE DemoTable ( Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, Value INT ); रिकॉर्ड

  1. - MySQL में आरक्षित शब्द 'index' को कॉलम नाम के रूप में उपयोग करने पर सिंटैक्स त्रुटि ठीक करें

    समस्या MySQL में INDEX एक आरक्षित शब्द (reserved word) है, इसलिए इसे सीधे कॉलम नाम के रूप में उपयोग करने पर सिंटैक्स त्रुटि होती है। त्रुटि उदाहरण ) ENGINE=MyISAM; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right

  1. - MySQL में विशिष्ट मान को फिक्स करके बाकी पंक्तियाँ रैंडम क्रम में कैसे दिखाएं?

    MySQL में किसी विशिष्ट मान वाली पंक्ति को शीर्ष पर फिक्स करके, शेष पंक्तियों को रैंडम क्रम में प्रदर्शित करने के लिए, ORDER BY में बूलियन एक्सप्रेशन और RAND() का संयोजन उपयोग करें। उदाहरण: मान 40 को शीर्ष पर रखें, बाकी रैंडम डेमो टेबल बनाएं: mysql> CREATE TABLE DemoTable1921 (Number INT); डेट