Aggiornare molte righe in una tabella con una singola istruzione?
Domanda
Qual è il modo più semplice per aggiornare molte righe di una tabella? Ho un file CSV che assomiglia a questo:
|primary_key |value|
| 1 | xyz|
| 2 | abc|
| 3 | def|
...
righe con queste chiavi primarie esiste già nella tabella di destinazione
Vorrei aggiornare la tabella di destinazione con questi valori. C'è la sintassi in modo che io possa scrivere qualcosa di simile:
update mytable set value = ('xyz', 'abc', 'def') where primary key = (1,2,3);
MySQL Aggiornamento riferimento , questo sito ( MySQL - csv aggiornamento ), SO ( aggiornamento più righe , più aggiornamenti db , più righe ), ho il sospetto che la risposta è "no", ma io 'd come per confermare che questo è vero.
Soluzione
In primo luogo qui è dati di esempio
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>
Ecco la nuova query
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;
Ecco la nuova query eseguita ??p>
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>
Altri suggerimenti
Supponendo che non si desidera caricare i dati dal file CSV in una tabella di database e poi fare un UPDATE
correlata,
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)
allora si dovrebbe essere in grado di utilizzare un 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);