• 締切済み

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  するのではなく、一部のカラムをアップデートしたい、ということです。 どなたか、教えて頂けると助かります。 よろしくお願い致します。

みんなの回答

  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.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

回答No.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」を付けて実行するだけ。

関連するQ&A