こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

締切り済みの質問

csvファイルを使ってMySQLのテーブルを更新し

約2万件ある15個のカラムで構成されるMySQLのテーブルがあります。
このテーブルをcsvファイルを使って更新しようと考えています。

csvファイルにはレコードIDとあるカラムの変更する値の2つのセルで
構成されています。
行数は毎回異なりますが、だいたい300行前後です。

csvファイルの具体的イメージはこんな感じです。

id order
============
2, 200
4, 10
7, 460
11, 35

MySQLのテーブルの方にも「id」と「order」というカラムが存在します。

java や PHP を使ってやる方法はわかるんですが、プログラムを作成しないで
SQLだけで行いたいと考えています。

LOAD DATA LOCAL INFILE などがあることがわかったのですが、レコードを REPLACE 
するのではなく、一部のカラムをアップデートしたい、ということです。

どなたか、教えて頂けると助かります。

よろしくお願い致します。

投稿日時 - 2015-12-27 14:22:39

QNo.9102088

困ってます

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(2)

ANo.2

テンポラリーテーブルに読み込んで、2テーブル比較してupdate実行とかになるでしょうか?
1文ではどのみち無理。
以下3文を、ファイルに保存

-- text.sql で保存--
create temporary table `temp_csv` (id int primary key not null, `order` int);
LOAD DATA local INFILE 'file.csv'
INTO TABLE `temp_csv`
fields TERMINATED BY ',' ENCLOSED BY ''
lines TERMINATED BY '\r\n'
IGNORE 1 LINES ;
update `org`,`temp_csv` set `org`.order = `temp_csv`.order where `org`.id =`temp_csv`.id ;
-- -- ここまで

元テーブル名 `org` は適宜そちらのテーブル名に合わせてください。csvファイルは1行目にカラム名行があるとして、読み込み除外してます。
コマンドプロンプトで、csvファイルがあるディレクトリーに移動、sqlファイルも同じディレクトリーに置いて、mysqlクライアント に sqlファイルを実行させればいいと思う。

-- コマンド例
mysql --user=user_name --password=your_password db_name < text.sql

あと、実行ユーザーに create権限とか file権限とかいろいろ必要です。

参考
https://dev.mysql.com/doc/refman/5.6/ja/update.html
複数updateのテーブルの例文と同じことやってます。

https://dev.mysql.com/doc/refman/5.6/ja/mysql-batch-commands.html

投稿日時 - 2015-12-29 16:19:45

ANo.1

MySQLは知りませんが、Oracleであれば(多分、記述方法は同じと思うが)

UPDATE テーブル名 SET order=200 WHERE id=2;
UPDATE テーブル名 SET order=10 WHERE id=4;
UPDATE テーブル名 SET order=460 WHERE id=4;
UPDATE テーブル名 SET order=35 WHERE id=11;
・・・
COMMIT;
を生成すればよい。

CSVファイルを読み、上記orderとidの値部分へCSVから貼り付ける
ようなプログラムを作ればよいかと思います。
(固定部分はテンプレートとして事前に準備しておく)

または雛形で
"UPDATE テーブル名 SET order="と" WHERE id="と" ;"をExcel上で
必要な行数分用意しておき、別シートでCSVを開き=CONCATENATE関数で
固定部の3つと変数の2つを結合すればSQLの出来上がり。
後は、メモ帳に貼り付け拡張子に「.sql」を付けて実行するだけ。

投稿日時 - 2015-12-28 16:59:32

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-