データロードで不正データがある場合にロールバックする方法
COPYコマンドでオプションを付けずにデータロードを行うと、不正データ(桁溢れなどのデータ)以外は、ロードが正常に実行されます。※不正データは、Rejected Dataファイルに出力されます。
不正データがあった場合、ロード処理全体をロールバックするようにしたいときは、COPYコマンドに”ABORT ON ERROR”オプションをつけて実行してください。
例 : INT型のカラムに有効桁数以上の数値をロードした場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
▼ファイルの7レコード目に19桁以上の数値を設定 $ more test.csv 1 2 3 4 5 6 9999999999999999999999999 ▼COPYコマンドを使用しDIRECTのみでロードすると不正データによるエラーは表示されず、不正データ以外はロードされます。 dbadmin=> copy test from '/home/dbadmin/test.csv' direct; Rows Loaded ------------- 6 (1 row) dbadmin=> select * from test; a --- 1 2 3 4 5 6 (6 rows) ▼COPYコマンドに"ABORT ON ERROR"を付けることで、有効桁数を超える数値のロードで不正データによるエラーが発生しロードデータはロールバックされます。 dbadmin=> copy test from '/home/dbadmin/test.csv' abort on error direct; ERROR 2035: COPY: Input record 7 has been rejected (int8 out of range '9999999999999999999999999' for column 1 (a)) dbadmin=> select * from test; a --- (0 rows) |