삽입에 대한 열 목록에서 기본값이있는 열이 참조되지 않는 삽입을 수행 할 때 기본값 제약이 적용됩니다. 예를 들어
:
그러나
TESTDB.ADMIN(ADMIN)=> create table default_test (col1 varchar(10),
TESTDB.ADMIN(ADMIN)(> col2 varchar(10) default 'myDefault', col3 varchar(10));
CREATE TABLE
TESTDB.ADMIN(ADMIN)=> insert into default_test (col1, col3) values ('A','C');
INSERT 0 1
TESTDB.ADMIN(ADMIN)=> select * from default_test;
COL1 | COL2 | COL3
------+-----------+------
A | myDefault | C
(1 row)
, 당신은 nzload을 수행 할 때, Netezza를 실제로로드 데이터 파일에 정의 된 외부 테이블에서 선택하여 대상 테이블에 삽입을 수행하고 있습니다. 이렇게하면 열 목록의 각 열을 포함하므로 외부 테이블의 데이터 파일에있는 값이 NULL이거나 빈 문자열이더라도 기본값이 트리거되지 않습니다.
[[email protected] test]$ cat test.txt
A,B,C
D,,F
G,NULL,I
TESTDB.ADMIN(ADMIN)=> create external table default_test_ext
TESTDB.ADMIN(ADMIN)-> sameas default_test using (
TESTDB.ADMIN(ADMIN)(> dataobject '/export/home/nz/test/test.txt' delimiter ','
TESTDB.ADMIN(ADMIN)(>);
CREATE EXTERNAL TABLE
TESTDB.ADMIN(ADMIN)=> select * from default_test_ext;
COL1 | COL2 | COL3
------+------+------
A | B | C
D | | F
G | | I
(3 rows)
TESTDB.ADMIN(ADMIN)=> select * from default_test_ext where
TESTDB.ADMIN(ADMIN)-> (col2 is null or col2 = '');
COL1 | COL2 | COL3
------+------+------
D | | F
G | | I
(2 rows)
NULL 및 빈 문자열은 유효한 값이며 nzload는 삽입시 해당 열을 참조하므로 기본값을 사용할 수 없으며 사용할 수 없습니다. 예상대로 작동하지만, NULL이나 빈 문자열을 컬럼의 기본값으로 변환하도록 nzload에 지시 할 수 있다면 확실히 유용 할 것입니다. 불행히도 그 기능은 현재 존재하지 않습니다 (최소한 내 지식은 아닙니다).
이것은 하이퍼 클럭이지만, 외부 테이블을 수동으로 수행하고 두 단계로로드하여 데이터로드에 대해 알아 냈습니다.
TESTDB.ADMIN(ADMIN)=> truncate table default_test;
TRUNCATE TABLE
TESTDB.ADMIN(ADMIN)=> insert into default_test (col1, col3)
TESTDB.ADMIN(ADMIN)-> select col1, col3 from default_test_ext
TESTDB.ADMIN(ADMIN)-> where (col2 is null or col2 = '');
INSERT 0 2
TESTDB.ADMIN(ADMIN)=> select * from default_test;
COL1 | COL2 | COL3
------+-----------+------
D | myDefault | F
G | myDefault | I
(2 rows)
TESTDB.ADMIN(ADMIN)=> insert into default_test
TESTDB.ADMIN(ADMIN)-> select * from default_test_ext
TESTDB.ADMIN(ADMIN)-> where (col2 is not null and col2 <> '');
INSERT 0 1
TESTDB.ADMIN(ADMIN)=> select * from default_test;
COL1 | COL2 | COL3
------+-----------+------
A | B | C
D | myDefault | F
G | myDefault | I
(3 rows)
그래,이게 네가 Netezza가 어떻게 작동하는지 더 잘 이해하는 데 도움이된다. 그래서 두 번 확인하기 위해서, 예제의 외부 테이블 코드는'nzload'와 똑같은 것을 보여주는 것을 돕는 것이 었습니다, 맞습니까? 친구에게 말하면서, 또 다른 해결 방법은'nzload'를 통해 스테이징 테이블을 만드는 것인데,이 테이블은'NULL' 값이나 빈 문자열을 가질 것입니다. 그런 다음이 스테이징 테이블을 통해 다른 모든 사람들이 사용할 실제 테이블에 삽입하십시오. 나는 그것이 꽤 영리하고 논리적 인 생각이라고 생각한다. 그냥 내가 나누겠다고 생각 했어. – Zhouster