Viele Zeilen in einer Tabelle mit einer einzigen Anweisung aktualisieren?
Frage
Was ist der einfachste Weg, um viele Zeilen in einer Tabelle zu aktualisieren? Ich habe eine CSV -Datei, die so aussieht:
|primary_key |value|
| 1 | xyz|
| 2 | abc|
| 3 | def|
...
Zeilen mit diesen Primärschlüssel existieren bereits in der Zieltabelle
Ich möchte die Zieltabelle mit diesen Werten aktualisieren. Gibt es Syntax, damit ich etwas schreiben kann wie:
update mytable set value = ('xyz', 'abc', 'def') where primary key = (1,2,3);
Schauen durch die MySQL Update Referenz, Diese Seite (MySQL - CSV -Update), ALSO (Aktualisieren Sie mehrere Zeilen, Mehrere DB -Updates, Aktualisieren Sie mehrere Zeilen), Ich vermute, dass die Antwort "Nein" ist, aber ich möchte bestätigen, dass dies wahr ist.
Lösung
Zuerst hier sind Beispieldaten
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>
Hier ist die neue Frage
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;
Hier ist die neue Abfrage, die ausgeführt wird
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>
Andere Tipps
Angenommen, Sie möchten die Daten nicht aus der CSV -Datei in eine Datenbanktabelle laden und dann eine korrelierte Durchführung durchführen 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)
Dann sollten Sie in der Lage sein, a zu verwenden 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);