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.

È stato utile?

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

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a dba.stackexchange
scroll top