テーブルの多くの行を更新する最も簡単な方法は何ですか?次のようなcsvファイルがあります。
|primary_key |value|
| 1 | xyz|
| 2 | abc|
| 3 | def|
...
これらの主キーを持つ行はすでにターゲットテーブルに存在します
これらの値でターゲットテーブルを更新したいと思います。構文はありますか?
update mytable set value = ('xyz', 'abc', 'def') where primary key = (1,2,3);
MySQL Update Reference を見ると、このサイト( MySQL-csv update )、SO( pdate multiple rows =、 複数のdb更新 、 複数の行を更新 )、私は答えが「いいえ」であると思いますが、これが本当であることを確認したいと思います。
まずはサンプルデータです
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>
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);