

毎度お世話になっています。

今回、既存のデータをリレーションに分割したテーブルにインポートする方法を探しています。

現在はORマッパーを使用したプログラムを組んで変換してインポートするようにしてるのですが、毎回プログラムを組むのはめんどくさいです。  
何か良い方法はないでしょうか。

というか皆さんこういう時どうしていますか?

エクセルで作られたデータをデータベースにインポートする時など。


CC BY-SA 3.0
2015-01-30T02:55:58.823
5597
2015-02-18T07:40:58.983
7339
question
mysql
既存のデータをリレーションに分割したテーブルにインポートする方法


[「Xの一覧が知りたい」という質問の傾向と他サイトでの対応](https://ja.meta.stackoverflow.com/questions/1381)
の「質問と一緒に回答も提示され、さらに他の回答を期待している」に該当しそうですが。ento♦さんコメントでの情報引出し感謝です。

この問題は、結局のところ次の煩雑さが原因だと思います。

  * スキーマを作るのが面倒くさい。
  * 外部キーの紐付けが面倒くさい。
  * (追加して)インポートのためだけにOR/Mでコード書くの面倒くさい。

とりあえず上記を前提として話を進めます。  
一度「何が問題(ネック)になっているか」を考えなおして、再投稿しても良いかもしれません。

## 方法1: EXCEL側で最終的な形にする

もし最終的な格納データを、EXCEL上で作れるならば(リレーションキーの値も含め)  
Integer, String, Integer  
id, name, age  
1, ISHII, 33  
みたいな形のCSVを作ってしまって、コンバートするようなプログラムを書いたほうが楽でしょう。あるいは、VBAからODBCでMySQLへアクセスしてしまうのも手です。

一応、<http://www-jp.mysql.com/why-mysql/windows/excel/> (MySQL for
EXCEL)というものも存在しますが。 使ったことがないので私からは何とも言えません(軽く調べたところ。テーブル作成やスキーマ更新もできるようですが)。

## 方法2: DB側で最終的な形にする

テーブルスキーマ(CREATE TABLE)の手間はあるでしょうが  
とりあえずMySQLのストレージエンジンをCSVで指定したテーブルに、ガッツリ放り込んで。  
シコシコとSQLだけで済ませてしまうのも手です。  
インポートした後に、user_idとか関連付けるものを追加して、  
UPDATE t1, t2 SET t2.user_id t1.id WHERE ...  
みたいなことやれば良いのではないでしょうか。

## 方法3: ACCESSで作れと抗議する

説明省略。

EXCELで入力されたデータが信用できなくて、データ検証もしたいという話などであれば……どのような手段であれ50歩100歩だと思います。


CC BY-SA 3.0
2015-02-18T07:40:58.983
6687
2015-02-18T07:40:58.983
2017-03-16T14:42:13.233
-1
8335
5597
answer