質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.46%
Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

4439閲覧

SQL*Loaderを使ったデータの置き換え

reitou_togamu

総合スコア2

Oracle

Oracleは、米オラクルが取り扱うリレーショナルデータベース管理システムです。メインフレームからPCまで、多様なプラットフォームに対応しています。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/08/24 02:34

編集2020/08/24 04:43

SQL*Loaderを使用し、csvファイルの特定のデータを選択しテーブルに取り込みたいです。
CSVファイルの中身が以下の通りだとし、左から順番に
id,name,age,phoneNoというテーブル項目でidとnameがPKです。

【csv】
1,佐藤,35,000-0000-0000
2,鈴木,32,111-1111-1111
3,田中,28,222-2222-2222
3,田中,28,222-2222-2121

これをそのままSQL*Loaderで挿入しようとすると、3行目と4行目が一意制約に引っかかってしまい挿入できません。
結果として、

3,田中,28,222-2222-2121

のデータをテーブルに挿入し、上の、

3,田中,28,222-2222-2222

のデータは挿入されないようにしたいです。
どうすればそのデータのみが挿入されるようにできるでしょうか?

制御ファイルの内容は以下の通りです。

OPTIONS
(DIRECT=FALSE,ERRORS=-1)

LOAD DATA
INFILE 'C:\data.csv' BADFILE 'C:\data.bad'
APPEND
INTO TABLE EMP
FIELDS TERMINATED BY','
OPTIONALLY ENCLOSED BY'"'
TRAILING NULLCOLS
(
id CHAR,
name CHAR,
age DECIMAL EXTERNAL,
phoneNo CHAR
)

ちなみに、
APPENDではなくREPLACEでも行ってみましたが、
一つ目のデータが挿入され、PKがダブっている二つ目のデータはBADファイルに飛ばされてしまいました。
逆のことがやりたいことなのですが・・・。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2020/08/24 02:52

制御ファイルの設定内容を質問に追記して下さい。
guest

回答1

0

ベストアンサー

本来は一意制約がないデータをロードすべきです。

どうしてもということであれば、
一度一意制約を外し、ロードし、ダブったデータをUPDATE、一意制約を追加しては?

投稿2020/08/24 03:58

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

reitou_togamu

2020/08/24 04:31

実際にはPKがダブったデータを含め数千件のデータがあるため、UPDATEするデータを1件1件探すよりも、ダブった後のデータだけを残すようにしたいです。ダブっているデータは後に来たものが正であることは確実です。
sazi

2020/08/24 04:56 編集

REPLACEなら置き換えなので、後のデータが使用されるはずので、CSVの順序を確認されてみて下さい。 PARALLEL=trueだと順番は保たれないと思いますが。
reitou_togamu

2020/08/24 06:23

ありがとうございます。しかしREPLACEはPKが同じ行を置き換えるということではなく、あくまでもすべてのデータが同じものを入れる際元のデータを消して置き換えているようです。 ここで上げている例でいうと、 3行目の田中さんの行を消して3行目の田中さんのデータを入れる。 4行目の田中さんの行を消して4行目の田中さんのデータを入れる。 しかし4行目の田中さんのデータは3行目の田中さんのデータとPKがダブっているため一意制約に反してしまうのでBadファイルに送られる。 という形のようです。 TRUNCATEも同様でした。APPENDは、 3行目の田中さんのデータがあっても3行目の田中さんのデータを新しく入れようとするためこれは当たり前のようにPKがダブってしまいました。 SQL*Loader以外も使用しなくてはいけなそうな気もしています・・・。
sazi

2020/08/24 06:34 編集

Truncateは目的に合いませんか? →ああ、試されていたのですね。
sazi

2020/08/24 09:36 編集

外部データの取込は、一旦ワークテーブルに取り込む方が、新たなパターンが発生した時など、色々と対応しやすいかと思います。 私は殆ど、全てが文字属性の一時テーブルに取り込んでから、正式なデータへの反映を行うようにしています。
Orlofsky

2020/08/24 09:33

別テーブルにロードして、元テーブルに同一キーがなければINSERT、同一キーがあって別テーブルの年齢や電話番号が元テーブルより小さかったらUPDATEしては?MERGEが使えるかはわからないけど。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.46%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問