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


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
আপনি কোন ডাটাবেস ব্যবহার করছেন?
হার্ট সিও

আমি মাইএসকিউএল ডাটাবেস ব্যবহার করছি।
ব্যবহারকারী 3022527

সিলেক্ট থেকে আপডেট করা উত্তর হতে পারে স্ট্যাকওভারফ্লো.com
জোনাথন বেন

উত্তর:


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

এখানে এসকিউএলফিডাল ডেমো রয়েছে

বা শর্তসাপেক্ষ আপডেট

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');

এখানে এসকিউএলফিডাল ডেমো রয়েছে


1
হ্যাঁ, এটি ঠিক আছে তবে যখন আমি কোনও ক্যোয়ারীতে 16 টি রেকর্ড আপডেট করতে চাই? আমি কি যোগ X x 16 ব্যবহার করব?
ব্যবহারকারী 3022527

19
আপনি উচিত প্রথম স্থানে আপনার প্রশ্নের এ ধরনের গুরুত্বপূর্ণ বিবরণ উল্লেখ করুন। যাইহোক অন্য সমাধানের জন্য আপডেট উত্তর দেখুন (শর্তসাপেক্ষ আপডেট)।
পিটার্ম

1
আপনার উদাহরণগুলিতে টি 1 এবং টি 2 কী?
পল ব্রউভেসিনস্কি

1
আপনাকেও হ্যালো @ পলব্রুবজাইস্কি। এগুলি টেবিলের নাম এবং এগুলি config AS t1যেখানে alচ্ছিক সেখানে লেখা যেতে পারে AS
পিটার্ম

@ পেটারম: এসকিউএলফিডাল লিঙ্কগুলি নষ্ট হয়ে গেছে। অন্যথায়, শর্তসাপেক্ষ আপডেট কৌশল দুর্দান্ত কাজ করছে। ধন্যবাদ!
জোনাথন বেন

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

এটি সারণীতে নতুন মান সন্নিবেশ করানো হয়েছে, তবে যদি প্রাথমিক কীটি সদৃশ হয় (ইতিমধ্যে টেবিলের মধ্যে সন্নিবেশ করা) যা আপনার নির্দিষ্ট করা মানগুলি আপডেট হবে এবং একই রেকর্ডটি দ্বিতীয়বার sertedোকানো হবে না।


26
একটি দুর্দান্ত স্মার্ট হ্যাক। আমি অবাক.
ব্লেইস

6
না Postgres জন্য সমর্থিত দেখুন: stackoverflow.com/questions/1109061/...
kevzettler

এছাড়াও, কিছু ছোটখাট পাঠ্য সম্পাদনা সহ কিছুটা সিএসভি (বা অনেক) কে টেবিল সন্নিবেশ / আপডেট / উপস্থাপনে পরিণত করার দুর্দান্ত উপায়!
ওলফটোন

6
এটি মাইএসকিউএল সমাধান, পোস্টগ্র্রেস বা এমএসএসকিউএল নয়।
আরজেড এমকে

1
এটি স্বতঃআগ্রহ পরিচয় আইডি বৃদ্ধি করবে, এমনকি রেকর্ডটি sertedোকানো বা আপডেট না করা থাকলেও
টিমো হুভিনেন

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)

,৮,77। টি ব্যবহারকারীর আইডি এবং সেই ব্যবহারকারী আইডির জন্য আমাকে যথাক্রমে বেস_আইডি ৯৯৯ এবং ৮৮ আপডেট করতে হবে। এটি আমার পক্ষে কাজ করে।


এখানে অন্যতম সেরা, আমার জন্য দুর্দান্ত কাজ করেছেন।
শাহরুখ আনোয়ার

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

এই এসকিউএল বিদ্যমান রেকর্ড আপডেট করে এবং নতুন করে সন্নিবেশ করে (1 এ 2)


1
আমি দেখতে পাচ্ছি, আপনার ক্যোয়ারী অনুসারে টেবিলের জন্য আইডি পিকে হয়। মনে করুন 2 বা তার বেশি কলাম পিকে হিসাবে বিবেচিত হবে (সম্মিলিত কী) ... সেক্ষেত্রে দ্বন্দ্বটি পরীক্ষা করার সঠিক উপায়টি কী হওয়া উচিত।
শ্রীতম জগদেব

6

ক্যামিলের সমাধান কাজ করেছিল। এটি একটি বেসিক পিএইচপি ফাংশনে পরিণত হয়েছে, যা এসকিউএল বিবৃতি লিখে দেয়। আশাকরি এটি কাউকে সাহায্য করবে।

    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

আপনার সাথে একটি এক্সেল স্প্রেডশীট মধ্যে আপডেটে মূল্যবোধের তালিকা আছে অভিমানী 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
বিভিন্ন সারিতে বিভিন্ন মান যদি হয়? উদাহরণস্বরূপ কর্মচারীদের SET বেতন = 1125 WHERE নাম = 'বব'; কর্মীদের আপডেট করুন আপডেট করুন = 1200 WHERE নাম = 'জেন'; কর্মীদের আপডেট করুন আপডেট করুন = 1100 WHERE নাম = 'ফ্র্যাঙ্ক'; কর্মীদের আপডেট করুন আপডেট করুন = 1175 WHERE নাম = 'সুসান'; কর্মীদের আপডেট করুন আপডেট করুন = 1150 ওভার নাম = 'জন';
আবদুল্লাহ নুরুম
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.