SQL - อัปเดตหลายระเบียนในแบบสอบถามเดียว


133

ฉันมีโต๊ะ - การตั้งค่า schema: 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
คุณใช้ฐานข้อมูลอะไร
Hart CO

ฉันใช้ฐานข้อมูล MySQL
user3022527

อัปเดตจาก Select อาจเป็นคำตอบstackoverflow.com/questions/2334712/…
Jonathan Benn

คำตอบ:


169

ลองใช้ไวยากรณ์การอัปเดตหลายตาราง

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 ระเบียนในแบบสอบถามเดียว ฉันเลือกใช้ JOIN x 16 หรือไม่
user3022527

20
คุณควรพูดถึงรายละเอียดที่สำคัญดังกล่าวในคำถามของคุณตั้งแต่แรก ดูคำตอบที่อัปเดตสำหรับโซลูชันอื่น (การอัปเดตตามเงื่อนไข)
peterm

1
t1 และ t2 ในตัวอย่างของคุณคืออะไร?
Paul Brewczynski

1
สวัสดีคุณเช่นกัน @PaulBrewczynski นี่คือนามแฝงของตารางและสามารถเขียนได้config AS t1โดยที่ASเป็นทางเลือก
เตอร์

@peterm: ลิงก์ SQLFiddle เสีย มิฉะนั้นเทคนิคการอัปเดตตามเงื่อนไขจะทำงานได้ดี ขอบคุณ!
Jonathan Benn

142

คุณสามารถทำได้ด้วยการแทรกด้านล่าง:

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
ไม่รองรับ Postgres ดู: stackoverflow.com/questions/1109061/…
kevzettler

นอกจากนี้ยังเป็นวิธีที่ยอดเยี่ยมในการเปลี่ยน CSV เล็กน้อย (หรือมาก) ให้เป็นการแทรก / อัปเดต / การเพิ่มตารางด้วยการแก้ไขข้อความเล็กน้อย!
wulftone

6
นี่คือโซลูชัน MySQL ไม่ใช่ Postgres หรือ MSSQL
Rz Mk

1
สิ่งนี้จะเพิ่มรหัสการเพิ่มอัตโนมัติแม้ว่าจะไม่ได้ใส่หรืออัปเดตบันทึกก็ตาม
Timo Huovinen

15

ในกรณีของฉันฉันต้องอัปเดตระเบียนที่มีมากกว่า 1,000 รายการแทนการกดปุ่มอัปเดตแบบสอบถามทุกครั้งที่ฉันต้องการสิ่งนี้

   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 เป็นรหัสผู้ใช้และสำหรับรหัสผู้ใช้เหล่านั้นฉันต้องอัปเดต base_id 999 และ 88 ตามลำดับสิ่งนี้ใช้ได้กับฉัน


หนึ่งในสิ่งที่ดีที่สุดที่นี่ทำงานได้ดีสำหรับฉัน
Shahrukh Anwar

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 in 1)


1
อย่างที่ฉันเห็น id คือ pk สำหรับตารางตามแบบสอบถามของคุณสมมติว่ามี 2 คอลัมน์ขึ้นไปที่ถือว่าเป็น pk (คีย์คอมโพสิต) ... ในกรณีนี้สิ่งที่ควรเป็นวิธีที่ถูกต้องในการตรวจสอบความขัดแย้ง
Sritam Jagadev

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ในคอลัมน์A1และconfig_nameในB1คุณสามารถเขียนแบบสอบถามได้อย่างง่ายดายโดยใช้สูตร Excel เช่น

=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 WHERE name = 'Bob'; UPDATE พนักงาน SET เงินเดือน = 1200 WHERE name = 'Jane'; UPDATE พนักงาน SET เงินเดือน = 1100 WHERE name = 'Frank'; UPDATE พนักงาน SET เงินเดือน = 1175 WHERE name = 'Susan'; UPDATE พนักงาน SET เงินเดือน = 1150 WHERE name = 'John';
Abdullah Nurum
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.