データロードで不正データがある場合に、不正データの行だけスキップする方法
COPYコマンドでデータロードを行うと、カラム幅よりも大きなデータは溢れた分を切り捨てた状態でロードします。
このような挙動をするデータ型としては、varchar型、char型、binary型、varbinary型があります。
※int型はデータを切り捨てずに、エラーになります。
このように切り捨てられるデータはスキップし(ロードしない)、正しいデータの行だけをロードしたいときはCOPYコマンドに”ENFORCELENGTH”オプションをつけて実行してください。
例 : varchar型、char型のカラムに有効桁数以上のデータをロードした場合
$ cat t1.csv
1,abc,abc
2,abcd,abcd
3,abcde,abcde
4,あ,あ
5,あい,あい
6,あいう,あいう
12345678901234567890,test,test
▼COPYコマンドを使用しDIRECTのみでロードすると不正データによるエラーは表示されず、不正データ以外はロードされます。
dbadmin=> truncate table t1;
TRUNCATE TABLE
dbadmin=> copy t1 from '/home/dbadmin/t1.csv' delimiter ',' direct ;
Rows Loaded
-------------
6
(1 row)
dbadmin=> select * from t1;
col1 | col2 | col3
------+------+------
1 | abc | abc
2 | abcd | abcd
3 | abcd | abcd
4 | あ | あ
5 | あ | あ
6 | あ | あ
(6 rows)
▼COPYコマンドに"ENFORCELENGTH "を付けることで、有効桁数のデータのみがロードされます。
dbadmin=> truncate table t1;
TRUNCATE TABLE
dbadmin=> copy t1 from '/home/dbadmin/t1.csv' delimiter ',' ENFORCELENGTH direct ;
Rows Loaded
-------------
3
(1 row)
dbadmin=> select * from t1;
col1 | col2 | col3
------+------+------
1 | abc | abc
2 | abcd | abcd
4 | あ | あ
(3 rows)関連情報
データロードで不正データがある場合にロールバックする方法
https://www.ashisuto.co.jp/cm/analytics-database/load_error_rollback.html
検証バージョンについて
この記事の内容はVertica 9.1で確認しています。