質問: お世話になります。 今までも過去に何度も出ている質問と思いますが、過去ログでも見つからなかったので 質問いたします。 データベースの種類を問わず、ある既存のテーブルにCSVファイルをインポートする方法を 検討しています。 特定のフィールドにキーがあり、CSV側のデータがテーブル側のキーに該当しない場合は 新しい項目としてデータを追加(Import)、該当するキーがある場合はレコードの内容を 更新(UPDATE)させたいのですが、その方法を『全てのデータベースで 共通する方法』で行えればと思うのですが、そういった方法はありますでしょうか? 直接CSVと衝突させることができればベストなのですが、一度ダミーのテーブルにすべて インポートしてから比較して...という方法でも構いません。 まだ知識も浅いもので、今のやり方だと、コード側で一行ずつデータを取り出してあるかどうかを 比較してからINSERTなりUPDATEなりをして...といったことをCSVの行数分ループさせて いるのですが、これだとどうしても膨大な時間がかかってしまいます(15万件)。 データベースに依存しない、共通のSQLの範囲でこれらの作業を一つ二つのSQLで 行いたいのですが、そういった方法がありましたらご教授いただけますでしょうか。 よろしくお願いいたします。
回答: そもそも、CSV(などDB外のデータ)をDBに取り込む「標準的な方法」が存在しません。この時点でDB固有の機能を使わざるを得ないので、「標準的な方法」にこだわるのは意味がありません。 ・一行ずつ愚直に処理する ・テンポラリテーブルに一括で読み込んだあと、既存の表を更新+挿入 ・DB次第では一発でできる? のどれが効率的かは製品次第ですし、機能としては可能だとしても、運用上利用できない(例えば長時間テーブルロックがかかるのは都合が悪いとか)かもしれません。