

お世話になります。

今までも過去に何度も出ている質問と思いますが、過去ログでも見つからなかったので  
質問いたします。

データベースの種類を問わず、ある既存のテーブルにCSVファイルをインポートする方法を  
検討しています。

特定のフィールドにキーがあり、CSV側のデータがテーブル側のキーに該当しない場合は  
新しい項目としてデータを追加(Import)、該当するキーがある場合はレコードの内容を  
更新(UPDATE)させたいのですが、その方法を『全てのデータベースで  
共通する方法』で行えればと思うのですが、そういった方法はありますでしょうか？

直接CSVと衝突させることができればベストなのですが、一度ダミーのテーブルにすべて  
インポートしてから比較して…という方法でも構いません。

まだ知識も浅いもので、今のやり方だと、コード側で一行ずつデータを取り出してあるかどうかを  
比較してからINSERTなりUPDATEなりをして…といったことをCSVの行数分ループさせて  
いるのですが、これだとどうしても膨大な時間がかかってしまいます(15万件)。

データベースに依存しない、共通のSQLの範囲でこれらの作業を一つ二つのSQLで  
行いたいのですが、そういった方法がありましたらご教授いただけますでしょうか。

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


CC BY-SA 4.0
2019-01-10T06:08:35.547
51857
2019-01-11T13:15:40.570
2019-01-10T07:11:47.090
2238
9374
question
sql csv database
SQLでキーとなるデータがなければINSERTし、あれば該当キーのデータをUPDATEするような方法について


そもそも、CSV(などDB外のデータ)をDBに取り込む「標準的な方法」が存在しません。この時点でDB固有の機能を使わざるを得ないので、「標準的な方法」にこだわるのは意味がありません。

・一行ずつ愚直に処理する  
・テンポラリテーブルに一括で読み込んだあと、既存の表を更新+挿入  
・DB次第では一発でできる？

のどれが効率的かは製品次第ですし、機能としては可能だとしても、運用上利用できない(例えば長時間テーブルロックがかかるのは都合が悪いとか)かもしれません。


CC BY-SA 4.0
2019-01-11T13:15:40.570
51899
2019-01-11T13:15:40.570
5793
51857
answer