อัปเดตหลายแถวในตารางด้วยคำสั่งเดียว?


9

วิธีที่ง่ายที่สุดในการอัปเดตแถวจำนวนมากในตารางคืออะไร ฉันมีไฟล์ csv ที่มีลักษณะเช่นนี้:

|primary_key |value|
|          1 |  xyz|
|          2 |  abc|
|          3 |  def|
...

แถวที่มีคีย์หลักเหล่านี้มีอยู่แล้วในตารางเป้าหมาย

ฉันต้องการอัปเดตตารางเป้าหมายด้วยค่าเหล่านี้ มีไวยากรณ์เพื่อให้ฉันสามารถเขียนสิ่งที่ชอบ:

update mytable set value = ('xyz', 'abc', 'def') where primary key = (1,2,3);

มองผ่านMySQL ปรับปรุงอ้างอิงไซต์นี้ ( MySQL - ปรับปรุง CSV ) ดังนั้น ( ปรับปรุงหลายแถว , การปรับปรุงฐานข้อมูลหลาย , การปรับปรุงหลายแถว ) ผมสงสัยว่าคำตอบคือ "ไม่" แต่ผมอยากจะยืนยันว่านี้ เป็นความจริง.


ฉันเพิ่มแท็ก MySQL โดยสมมติว่าการอ้างอิงของคุณไปยังเอกสาร MySQL ซึ่งเป็นฐานข้อมูลที่คุณใช้
Justin Cave

คำตอบ:


10

อย่างแรกคือข้อมูลตัวอย่าง

mysql> drop table if exists mytable;
Query OK, 0 rows affected (0.03 sec)

mysql> create table mytable
    -> (
    ->     id int not null,
    ->     value VARCHAR(255),
    ->     primary key (id)
    -> );
Query OK, 0 rows affected (0.06 sec)

mysql> insert into mytable (id) values (1),(2),(3);
Query OK, 3 rows affected (0.06 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from mytable;
+----+-------+
| id | value |
+----+-------+
|  1 | NULL  |
|  2 | NULL  |
|  3 | NULL  |
+----+-------+
3 rows in set (0.00 sec)

mysql>

นี่คือแบบสอบถามใหม่

update mytable A inner join
(
    SELECT 1 id,'xyz' value UNION
    SELECT 2   ,'abc'       UNION
    SELECT 3   ,'def'

) B USING (id)
SET A.value = B.value;

นี่คือแบบสอบถามใหม่ที่ดำเนินการ

mysql> update mytable A inner join
    -> (
    ->     SELECT 1 id,'xyz' value UNION
    ->     SELECT 2   ,'abc'       UNION
    ->     SELECT 3   ,'def'
    -> ) B USING (id)
    -> SET A.value = B.value;
Query OK, 0 rows affected (0.06 sec)
Rows matched: 3  Changed: 0  Warnings: 0

mysql> select * from mytable;
+----+-------+
| id | value |
+----+-------+
|  1 | xyz   |
|  2 | abc   |
|  3 | def   |
+----+-------+
3 rows in set (0.00 sec)

mysql>

UPDATE table INNER JOIN ... USING(id) SET ...ดีมาก
Nino Škopac

3

สมมติว่าคุณไม่ต้องการที่จะโหลดข้อมูลจากไฟล์ CSV ลงในตารางฐานข้อมูลแล้วทำมีลักษณะร่วมกันUPDATE,

UPDATE mytable t
   SET value = (SELECT value
                  FROM tbl_with_csv_data csv
                 WHERE csv.primary_key = t.primary_key)
 WHERE EXISTS( SELECT 1
                 FROM tbl_with_csv_data csv
                 WHERE csv.primary_key = t.primary_key)

จากนั้นคุณควรจะสามารถใช้ CASE

UPDATE mytable t
   SET value = CASE WHEN primary_key = 1 THEN 'xyz'
                    WHEN primary_key = 2 THEN 'abc'
                    WHEN primary_key = 3 THEN 'def'
                    ELSE value
                END
 WHERE primary_key IN (1,2,3);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.