মাইএসকিউএল - এক কোয়েরিতে বিভিন্ন মান সহ একাধিক সারি আপডেট করুন


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 শর্তে যদি একাধিক শর্ত থাকে তবে কোনও ধারণা নেই কীভাবে কীভাবে করবেন তা আমি পুরোপুরি পরিষ্কার করছি না?


এটা কি তোমার প্রশ্নের উত্তর? মাইএসকিউএলে একাধিক আপডেট
পিটারপ্যান 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
@ ফ্রানভারগারা66 । । আমি আপনার মন্তব্য বুঝতে পারি না। updateএর শুধুমাত্র ইতিমধ্যে বিদ্যমান রেকর্ডগুলি প্রভাবিত করে।
গর্ডন লিনফ

আমার ইংরাজ স্যারকে ক্ষমা করুন, যখন আমি আপডেট মাইএসকিএল করার চেষ্টা করি তখন আমাকে ত্রুটি দেয়: # 1062 - কী 'প্রাথমিক' এর জন্য সদৃশ এন্ট্রি 'এক্সএক্সএক্সএক্স'। এটি যখন আমি ইতিমধ্যে ছিল একই মান সহ একটি রেকর্ড আপডেট করার চেষ্টা করি, যখন বর্তমান মান আপডেট হওয়ার সাথে একই থাকে তবে আপডেটটি এড়িয়ে যাওয়ার কোনও উপায় আছে কি?
franvergara66

1
@ ফ্রানভারগারা66 । । আপনার অন্যরকম সমস্যা হতে পারে। যদি cod_userএকটি প্রাথমিক কী হয় এবং মানগুলি চারপাশে বদলে যায় তবে একাধিক আপডেটগুলি সম্ভবত সেরা রুট।
গর্ডন লিনফ

1
হ্যাঁ, আমি দেখছি, আসল সমস্যাটি হ'ল বেশ কয়েকটি সহকারী রয়েছে, তারপরে কোনও আপডেট করার চেষ্টা করার সময়, প্রাথমিক কীটির অখণ্ডতা লঙ্ঘিত হয়। আপনার সময় জন্য আপনাকে অনেক ধন্যবাদ.
franvergara66

108

মাইএসকিউএল একক কোয়েরিতে একাধিক আপডেট একত্রিত করার আরও পঠনযোগ্য উপায়ের অনুমতি দেয়। এটি আপনার বর্ণনা করা দৃশ্যের সাথে আরও ভাল ফিট করে বলে মনে হচ্ছে, পড়া সহজ and

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), ...
গঠনটি

18
দ্রষ্টব্য: যদি টেবিলে অযাচিত রেকর্ডের ফলে কীটি উপস্থিত না থাকে তবে এটি নতুন সারি যুক্ত করবে।
ফারাজ

1
কখনও না Iোকানো আইওডকিউ ব্যবহার করার কৌশলটি তবুও খুব মার্জিত।
টম ডেস্প

এবং মনে রাখবেন এই পদ্ধতির প্রয়োজন প্রাথমিক কী টেবিলের জন্য সেট করা হয়।
ফ্লেমস্টোরম

5
বিকাশযোগ্য এমন কোনও কলাম বাদ দিলে এটি কাজ করবে না, যেহেতু বর্গোত্তর এখনও আপডেটের আশ্রয় নেওয়ার আগে নতুন রেকর্ড তৈরি করার চেষ্টা করে।
আরনো ভ্যান ওর্ড্ট

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

@ ট্র্যাভেডেক উত্তরটি প্রসারিত করতে ,

যদি অ-স্বতন্ত্র কীগুলি দিয়ে আপডেটটি করতে হয় তবে 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

এখানে কল 4 এবং কোল 1 টেবিল 1 এ রয়েছে। কল 2 এবং কল 3 টেবিল 2 এ রয়েছে
আমি প্রতিটি কল 1 আপডেট করার চেষ্টা করছি যেখানে প্রতিটি সারির জন্য কল 4 = কল 3 আলাদা মান


-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>

যেখানে পুশসেটিংস

public class PushSettings {

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

এটা ঠিক কাজ করে


লেখক ১ টি ক্যোয়ারী চান, এটি স্পষ্ট যে তিনি এটি
ভবিষ্যদ্বাণী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.