MySQL - एक क्वेरी में विभिन्न मानों के साथ कई पंक्तियों का अद्यतन करें


139

मैं यह समझने की कोशिश कर रहा हूं कि विभिन्न मूल्यों के साथ कई पंक्तियों को कैसे अपडेट किया जाए और मुझे यह नहीं मिला। समाधान हर जगह है लेकिन मेरे लिए यह समझना मुश्किल है।

उदाहरण के लिए, 1 क्वेरी में तीन अपडेट:

UPDATE table_users
SET cod_user = '622057'
    , date = '12082014'
WHERE user_rol = 'student'
    AND cod_office = '17389551'; 

UPDATE table_users
SET cod_user = '2913659'
    , date = '12082014'
WHERE user_rol = 'assistant'
    AND cod_office = '17389551'; 

UPDATE table_users
SET cod_user = '6160230'
    , date = '12082014'
WHERE user_rol = 'admin'
    AND cod_office = '17389551'; 

मैंने एक उदाहरण पढ़ा , लेकिन मुझे वास्तव में समझ में नहीं आया कि प्रश्न कैसे बनाया जाए। अर्थात:

UPDATE table_to_update
SET cod_user= IF(cod_office = '17389551','622057','2913659','6160230')
    ,date = IF(cod_office = '17389551','12082014')
WHERE ?? IN (??) ;

मुझे पूरी तरह से स्पष्ट नहीं है कि अगर WHERE में और IF स्थिति में कोई स्थिति हो तो क्वेरी कैसे करें..सभी विचारों में?


क्या इससे आपके सवाल का जवाब मिलता है? MySQL में एकाधिक अपडेट
पीटरपैन666

जवाबों:


188

आप इसे इस तरह से कर सकते हैं:

UPDATE table_users
    SET cod_user = (case when user_role = 'student' then '622057'
                         when user_role = 'assistant' then '2913659'
                         when user_role = 'admin' then '6160230'
                    end),
        date = '12082014'
    WHERE user_role in ('student', 'assistant', 'admin') AND
          cod_office = '17389551';

मुझे आपकी तारीख का प्रारूप समझ नहीं आ रहा है। डेट्स को मूल दिनांक और समय प्रकारों का उपयोग करके डेटाबेस में संग्रहीत किया जाना चाहिए।


मैं ऐसा कैसे कर सकता हूं ताकि अपडेट निष्पादित हो, अगर रिकॉर्ड पहले से मौजूद है
franvergara66

1
@ franvergara66 । । मैं आपकी टिप्पणी नहीं समझता। updates केवल पहले से मौजूद रिकॉर्ड को प्रभावित करता है।
गॉर्डन लिनोफ़ सेप

मेरे अंग्रेजी सर को क्षमा करें, जब मैं अपडेट करने की कोशिश करता हूं तो mysql मुझे त्रुटि देता है: # 1062 - कुंजी 'PRIMARY' के लिए डुप्लिकेट प्रविष्टि 'XXX'। ऐसा तब होता है जब मैं रिकॉर्ड को उसी मान के साथ अपडेट करने का प्रयास करता हूं जो पहले से ही था, क्या अपडेट को छोड़ने का कोई तरीका है यदि वर्तमान मूल्य अपडेट होने के समान है?
franvergara66

1
@ franvergara66 । । आपको एक अलग समस्या हो सकती है। यदि cod_userएक प्राथमिक कुंजी है और मानों को चारों ओर फेरबदल किया जा रहा है, तो कई अद्यतन शायद सबसे अच्छा मार्ग है।
गॉर्डन लिनोफ़

1
हाँ, मैं देखता हूं, असली समस्या यह है कि कई सहायक हैं, फिर जब एक अपडेट करने की कोशिश की जाती है, तो प्राथमिक कुंजी की अखंडता का उल्लंघन होता है। आपका समय देने के लिए आपका बहुत बहुत धन्यवाद।
franvergara66

108

MySQL एक एकल क्वेरी में कई अपडेट को संयोजित करने के लिए अधिक पठनीय तरीका देता है। यह आपके द्वारा वर्णित परिदृश्य को बेहतर ढंग से फिट करने के लिए लगता है, यह पढ़ने में बहुत आसान है, और उन कठिन-अनचाही एकाधिक स्थितियों से बचा जाता है।

INSERT INTO table_users (cod_user, date, user_rol, cod_office)
VALUES
('622057', '12082014', 'student', '17389551'),
('2913659', '12082014', 'assistant','17389551'),
('6160230', '12082014', 'admin', '17389551')
ON DUPLICATE KEY UPDATE
 cod_user=VALUES(cod_user), date=VALUES(date)

यह मानता है कि user_rol, cod_officeसंयोजन एक प्राथमिक कुंजी है। यदि इनमें से केवल एक ही प्राथमिक कुंजी है , तो दूसरे क्षेत्र को अद्यतन सूची में जोड़ें। यदि उनमें से कोई भी प्राथमिक कुंजी नहीं है (जो कि संभावना नहीं लगती है) तो यह दृष्टिकोण हमेशा नए रिकॉर्ड बनाएगा - शायद वह नहीं है जो चाहता है।

हालांकि, यह दृष्टिकोण तैयार बयानों को बनाने और अधिक संक्षिप्त करने के लिए आसान बनाता है।


4
धन्यवाद! यह वही है जो मैं लंबे समय से खोज रहा था, सबसे साफ दिखने वाला रास्ता, मैं इस वाक्यविन्यास का पता नहीं लगा सका, विशेष रूप से cod_user=VALUES(cod_user), ..., यहां तक ​​कि आधिकारिक MySQL 5.6 डॉक्स से
यूरी डायचकोव

18
नोट: यदि अनचाहे रिकॉर्ड के परिणामस्वरूप तालिका में कुंजी मौजूद नहीं है तो यह नई पंक्तियों को जोड़ देगा।
फ़राज़

1
मुश्किल कभी नहीं डालने के लिए IODKU का उपयोग करने के लिए मुश्किल, फिर भी बहुत सुरुचिपूर्ण।
टॉम डेस्प

और ध्यान दें कि इस दृष्टिकोण के लिए प्राथमिक कुंजी की आवश्यकता है तालिका के लिए सेट किया गया है।
फ्लेमस्टॉर्म

5
यह काम नहीं करता है यदि आप किसी भी स्तंभ को छोड़ देते हैं जो शून्य नहीं हो सकता है, क्योंकि sql अभी भी अद्यतन करने का सहारा लेने से पहले नया रिकॉर्ड बनाने की कोशिश करता है।
Arno van Oordt

15

यदि आप CASEकई स्थितियों को संभालने के लिए एक स्टेटमेंट का उपयोग कर सकते हैं, तो परिदृश्य:

UPDATE table_to_update 
SET  cod_user= CASE WHEN user_rol = 'student' THEN '622057'
                   WHEN user_rol = 'assistant' THEN '2913659'
                   WHEN user_rol = 'admin' THEN '6160230'
               END
    ,date = '12082014'
WHERE user_rol IN ('student','assistant','admin')
  AND cod_office = '17389551';

1
आपने CASE कथन के अंत में एक टाइपो बनाया: आपके पास एक दूसरे के बगल में 2 अल्पविराम हैं।
दोपहर का खाना

8
update table_name
set cod_user = 
    CASE 
    WHEN user_rol = 'student' THEN '622057'
    WHEN user_rol = 'assistant' THEN '2913659'
    WHEN user_rol = 'admin' THEN '6160230'?
    END,date = '12082014'

WHERE user_rol IN ('student','assistant','admin')
AND cod_office = '17389551';

0

@Trevedhek उत्तर पर विस्तार करने के लिए ,

यदि गैर-विशिष्ट कुंजियों के साथ अद्यतन किया जाना है, तो 4 प्रश्नों की आवश्यकता होगी

नोट: यह लेनदेन सुरक्षित नहीं है

यह एक अस्थायी तालिका का उपयोग करके किया जा सकता है।

चरण 1: एक अस्थायी तालिका कुंजियाँ और स्तंभ जिन्हें आप अद्यतन करना चाहते हैं बनाएँ

CREATE TEMPORARY TABLE  temp_table_users
(
    cod_user varchar(50)
    , date varchar(50)
    , user_rol varchar(50)
    ,  cod_office varchar(50)
) ENGINE=MEMORY

चरण 2: टेंपरेचर टेबल में मान डालें

चरण 3: मूल तालिका को अपडेट करें

UPDATE table_users t1
JOIN temp_table_users tt1 using(user_rol,cod_office)
SET 
t1.cod_office = tt1.cod_office
t1.date = tt1.date

चरण 4: अस्थायी तालिका छोड़ें


0
UPDATE Table1 SET col1= col2 FROM (SELECT col2, col3 FROM Table2) as newTbl WHERE col4= col3

यहाँ col4 & col1 तालिका 1 में हैं। col2 & col3 Table2
I Am में प्रत्येक कॉल 1 को अपडेट करने की कोशिश कर रहा है, जहां प्रत्येक पंक्ति के लिए col4 = col3 अलग-अलग मूल्य है


-1

मैंने इसे इस तरह किया:

<update id="updateSettings" parameterType="PushSettings">
    <foreach collection="settings" item="setting">
        UPDATE push_setting SET status = #{setting.status}
        WHERE type = #{setting.type} AND user_id = #{userId};
    </foreach>
</update>

जहां PushSettings है

public class PushSettings {

    private List<PushSetting> settings;
    private String userId;
}

यह बढ़िया काम करता है


लेखक 1 क्वेरी चाहता है, यह स्पष्ट है कि वह इसे
फॉर्च्यूनर के
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.