Perbarui banyak baris dalam tabel dengan satu pernyataan?

9

Apa cara termudah untuk memperbarui banyak baris dalam sebuah tabel? Saya memiliki file csv yang terlihat seperti ini:

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

Baris dengan kunci utama ini sudah ada di tabel target

Saya ingin memperbarui tabel target dengan nilai-nilai ini. Apakah ada sintaks sehingga saya dapat menulis sesuatu seperti:

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

Melihat melalui Referensi Pembaruan MySQL , situs ini ( pembaruan MySQL - csv ), SO ( perbarui beberapa baris , beberapa pembaruan db , perbarui beberapa baris ), saya menduga jawabannya adalah "tidak", tetapi saya ingin mengonfirmasi bahwa ini adalah benar.

David LeBauer
sumber
Saya menambahkan tag MySQL dengan asumsi bahwa referensi Anda ke dokumentasi MySQL menyiratkan bahwa itu adalah database yang Anda gunakan.
Justin Cave

Jawaban:

10

Pertama di sini adalah data sampel

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>

Ini pertanyaan baru

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;

Ini query baru yang dieksekusi

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>
RolandoMySQLDBA
sumber
UPDATE table INNER JOIN ... USING(id) SET ...is great
Nino Škopac
3

Dengan asumsi bahwa Anda tidak ingin memuat data dari file CSV ke dalam tabel database dan kemudian melakukan korelasi 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)

maka Anda harus dapat menggunakan 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);
Gua Justin
sumber