SQL - एक क्वेरी में कई रिकॉर्ड अपडेट करें


132

मेरे पास टेबल है - कॉन्फिग । स्कीमा: config_name | config_value

और मैं एक क्वेरी में कई रिकॉर्ड अपडेट करना चाहूंगा। मैं उस तरह की कोशिश करता हूं:

UPDATE config 
SET t1.config_value = 'value'
  , t2.config_value = 'value2' 
WHERE t1.config_name = 'name1' 
  AND t2.config_name = 'name2';

लेकिन यह प्रश्न गलत है :(

क्या आप मेरी मदद कर सकते हैं?


1
आप किस डेटाबेस का उपयोग कर रहे हैं?
हार्ट सीओ

मैं MySQL डेटाबेस का उपयोग कर रहा हूं।
user3022527

सेलेक्ट से अपडेट हो सकता है जवाब stackoverflow.com/questions/2334712/…
जोनाथन बेन्ह

जवाबों:


167

या तो मल्टी-टेबल अपडेट सिंटैक्स की कोशिश करें

UPDATE config t1 JOIN config t2
    ON t1.config_name = 'name1' AND t2.config_name = 'name2'
   SET t1.config_value = 'value',
       t2.config_value = 'value2';

यहाँ SQLFiddle डेमो है

या सशर्त अद्यतन

UPDATE config
   SET config_value = CASE config_name 
                      WHEN 'name1' THEN 'value' 
                      WHEN 'name2' THEN 'value2' 
                      ELSE config_value
                      END
 WHERE config_name IN('name1', 'name2');

यहाँ SQLFiddle डेमो है


1
हाँ, यह ठीक है लेकिन क्या होगा जब मैं एक क्वेरी में 16 रिकॉर्ड अपडेट करना पसंद करता हूं? मैं शॉलॉड जोइन एक्स 16 का उपयोग करता हूं?
user3022527

19
आपको अपने प्रश्न में इस तरह के महत्वपूर्ण विवरणों का उल्लेख करना चाहिए । वैसे भी एक और समाधान (सशर्त अद्यतन) के लिए अद्यतन जवाब देखें।
पेट्री

1
आपके उदाहरणों में t1 और t2 क्या है?
पॉल ब्रेवस्कीस्की

1
आपको @PaulBrewczynski भी नमस्कार। ये टेबल अलायस हैं और लिखा जा सकता है config AS t1कि ASवैकल्पिक कहां है।
पेट्रम

@peterm: SQLFiddle लिंक टूट गए हैं। अन्यथा, सशर्त अद्यतन तकनीक बहुत अच्छा काम कर रही है। धन्यवाद!
जोनाथन बेन

142

आप इसे नीचे के रूप में INSERT के साथ पूरा कर सकते हैं:

INSERT INTO mytable (id, a, b, c)
VALUES (1, 'a1', 'b1', 'c1'),
(2, 'a2', 'b2', 'c2'),
(3, 'a3', 'b3', 'c3'),
(4, 'a4', 'b4', 'c4'),
(5, 'a5', 'b5', 'c5'),
(6, 'a6', 'b6', 'c6')
ON DUPLICATE KEY UPDATE id=VALUES(id),
a=VALUES(a),
b=VALUES(b),
c=VALUES(c);

यह नए मानों को तालिका में सम्मिलित करता है, लेकिन यदि प्राथमिक कुंजी डुप्लिकेट की गई है (पहले से तालिका में डाली गई है) जो आपके द्वारा निर्दिष्ट मानों को अपडेट की जाएगी और उसी रिकॉर्ड को दूसरी बार नहीं डाला जाएगा।


26
एक सुंदर स्मार्ट हैक। मैं आश्चर्यचकित हूँ।
Blaise

6
पोस्टग्रेज के लिए समर्थित नहीं देखें: stackoverflow.com/questions/1109061/…
kevzettler 19

इसके अलावा, यह सीएसवी (या बहुत कुछ) के एक छोटे से मोड़ को कुछ मामूली संपादन संपादन के साथ तालिका सम्मिलित / अद्यतन / अद्यतन करने का एक शानदार तरीका है!
wulftone

6
यह एक MySQL समाधान है, Postgres या MSSQL नहीं।
आरजे एमके

1
यह स्वतःभरण आईडी
बढ़ाएगा

15

मेरे मामले में मुझे उन रिकॉर्ड्स को अपडेट करना है जो 1000 से अधिक हैं, इसके लिए हर बार जब मैंने इसे पसंद किया, तो अपडेट क्वेरी को हिट करने के बजाय,

   UPDATE mst_users 
   SET base_id = CASE user_id 
   WHEN 78 THEN 999 
   WHEN 77 THEN 88 
   ELSE base_id END WHERE user_id IN(78, 77)

78,77 उपयोगकर्ता Ids हैं और उन उपयोगकर्ता आईडी के लिए मुझे क्रमशः base_id 999 और 88 को अपडेट करना होगा। यह मेरे लिए काम करता है।


यहाँ सबसे अच्छे में से एक, मेरे लिए बहुत अच्छा काम किया।
शाहरुख अनवर

7

शायद किसी के लिए यह उपयोगी होगा

Postgresql 9.5 के लिए एक आकर्षण के रूप में काम करता है

INSERT INTO tabelname(id, col2, col3, col4)
VALUES
    (1, 1, 1, 'text for col4'),
    (DEFAULT,1,4,'another text for col4')
ON CONFLICT (id) DO UPDATE SET
    col2 = EXCLUDED.col2,
    col3 = EXCLUDED.col3,
    col4 = EXCLUDED.col4

यह SQL मौजूदा रिकॉर्ड और आवेषण को अद्यतन करता है यदि नया है (2 इन 1)


1
जैसा कि मैं देख सकता हूं, आईडी आपकी क्वेरी के अनुसार तालिका के लिए pk है। मान लीजिए कि pk (समग्र कुंजी) के रूप में 2 या अधिक स्तंभ हैं ... उस स्थिति में संघर्ष की जांच करने का सही तरीका क्या होना चाहिए।
श्रीतम जगदेव

6

कामिल का हल काम कर गया। इसे एक मूल PHP फ़ंक्शन में बदल दिया, जो SQL स्टेटमेंट को लिखता है। मनाइए कि यह किसी और के लिए सहायक हो।

    function _bulk_sql_update_query($table, $array)
    {
        /*
         * Example:
        INSERT INTO mytable (id, a, b, c)
        VALUES (1, 'a1', 'b1', 'c1'),
        (2, 'a2', 'b2', 'c2'),
        (3, 'a3', 'b3', 'c3'),
        (4, 'a4', 'b4', 'c4'),
        (5, 'a5', 'b5', 'c5'),
        (6, 'a6', 'b6', 'c6')
        ON DUPLICATE KEY UPDATE id=VALUES(id),
        a=VALUES(a),
        b=VALUES(b),
        c=VALUES(c);
    */
        $sql = "";

        $columns = array_keys($array[0]);
        $columns_as_string = implode(', ', $columns);

        $sql .= "
      INSERT INTO $table
      (" . $columns_as_string . ")
      VALUES ";

        $len = count($array);
        foreach ($array as $index => $values) {
            $sql .= '("';
            $sql .= implode('", "', $array[$index]) . "\"";
            $sql .= ')';
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= "\nON DUPLICATE KEY UPDATE \n";

        $len = count($columns);
        foreach ($columns as $index => $column) {

            $sql .= "$column=VALUES($column)";
            $sql .= ($index == $len - 1) ? "" : ", \n";
        }

        $sql .= ";";

        return $sql;
    }

5

इसके अलावा

UPDATE staff SET salary = 1200 WHERE name = 'Bob';
UPDATE staff SET salary = 1200 WHERE name = 'Jane';
UPDATE staff SET salary = 1200 WHERE name = 'Frank';
UPDATE staff SET salary = 1200 WHERE name = 'Susan';
UPDATE staff SET salary = 1200 WHERE name = 'John';

आप उपयोग कर सकते हैं

UPDATE staff SET salary = 1200 WHERE name IN ('Bob', 'Frank', 'John');

3

N पंक्तियों की संख्या को अपडेट करने के लिए नीचे दिए गए कोड को निष्पादित करें, जहां पेरेंट आईडी वह आईडी है जिससे आप डेटा प्राप्त करना चाहते हैं और चाइल्ड आईडी आईडी हैं जिन्हें अपडेट करने की आवश्यकता है, इसलिए इसे अपडेट करने के लिए केवल मूल आईडी और चाइल्ड आईडी जोड़ने की आवश्यकता है। सभी पंक्तियों को एक छोटी लिपि का उपयोग करने की आवश्यकता है।

    UPDATE [Table]
 SET couloumn1= (select couloumn1 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn2= (select couloumn2 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn3= (select couloumn3 FROM Table WHERE IDCouloumn = [PArent ID]),
     couloumn4= (select couloumn4 FROM Table WHERE IDCouloumn = [PArent ID]),
 WHERE IDCouloumn IN ([List of child Ids])

2

आप के साथ एक Excel स्प्रेडशीट में अद्यतन करने के लिए मानों की सूची है मान लें config_value कॉलम में ए 1 और config_name में बी 1 आप आसानी से एक एक्सेल सूत्र की तरह का उपयोग कर वहाँ क्वेरी ऊपर लिख सकते हैं

=CONCAT("UPDATE config SET config_value = ","'",A1,"'", " WHERE config_name = ","'",B1,"'")


1

यदि आप सभी कॉलम में सभी रिकॉर्ड अपडेट करना चाहते हैं, तो नीचे दिए गए कोड को निष्पादित करें:

update config set column1='value',column2='value'...columnN='value';

और यदि आप किसी विशेष पंक्ति के सभी कॉलम को अपडेट करना चाहते हैं तो नीचे दिए गए कोड को निष्पादित करें:

update config set column1='value',column2='value'...columnN='value' where column1='value'

3
क्या होगा अगर अलग पंक्ति में अलग मूल्य? उदाहरण के लिए UPDATE कर्मचारी SET वेतन = 1125 कहां = 'बॉब'; UPDATE कर्मचारी SET वेतन = 1200 जहां नाम = 'जेन'; अद्यतन कर्मचारियों का वेतन = 1100 जहां नाम = 'फ्रैंक'; UPDATE कर्मचारी SET का वेतन = 1175 जहां नाम = 'सुसान'; UPDATE कर्मचारी SET का वेतन = 1150 पर नाम = 'जॉन';
अब्दुल्ला नूरम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.