2014-07-14 2 views
1

int 데이터를 Netezza 서버의 테이블에로드하려고합니다. 그러나 데이터가 존재하지 않거나 null 인 경우 기본값으로 데이터를로드하는 방법을 모르겠습니다.Netezza - 기본값으로 데이터를 입력하십시오.

지금이 표는 두 개의 열로 구성되어 있으며 두 열 모두 고유 한 기본값을 갖습니다.

Attribute | Type | Modifier | Default Value 
----------+---------+----------+---------------- 
number1 | integer |   | 0 
number2 | integer |   | 100 

나는 현재 다음 nzload 명령을 실행하고 있습니다 : nzload -cf test.log

test.log 파일은 다음과 같습니다 :

test.dat 파일은 다음과 같습니다
DATAFILE /usr/me/test.dat 
{ 
    Database  test 
    TableName numberTest 
    Delimiter '|' 
} 

:

1|2 
3|4 
5|6 
7| 
|8 

내가 직면 한 문제는 명령이 정상적으로 실행되는 동안 정수 값은 기본값이 설정된 값과 반대로 Null이 기본값입니다. nzsql 내에서 삽입을 사용하여 시도하고 그 올바른 기본값을 만듭니다 있지만 nzload 함께 할 수있는 방법이 있는지 궁금 해서요.

도움을 주시면 감사하겠습니다.

답변

1

삽입에 대한 열 목록에서 기본값이있는 열이 참조되지 않는 삽입을 수행 할 때 기본값 제약이 적용됩니다. 예를 들어

:

그러나
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) 
+0

그래,이게 네가 Netezza가 어떻게 작동하는지 더 잘 이해하는 데 도움이된다. 그래서 두 번 확인하기 위해서, 예제의 외부 테이블 코드는'nzload'와 똑같은 것을 보여주는 것을 돕는 것이 었습니다, 맞습니까? 친구에게 말하면서, 또 다른 해결 방법은'nzload'를 통해 스테이징 테이블을 만드는 것인데,이 테이블은'NULL' 값이나 빈 문자열을 가질 것입니다. 그런 다음이 스테이징 테이블을 통해 다른 모든 사람들이 사용할 실제 테이블에 삽입하십시오. 나는 그것이 꽤 영리하고 논리적 인 생각이라고 생각한다. 그냥 내가 나누겠다고 생각 했어. – Zhouster

1

Netezza는 default value 제약 조건을 시행하지 않습니다. 그것은 단지 표기법을 위해 존재합니다. IBM Documentation. 테이블을 수정하려면 update 문장을 실행해야합니다.

+0

감사합니다. Niederee. 문서에서 그 부분을 놓쳤습니다. 'update' 문에서 기본값에 접근 할 수있는 방법이 있습니까? – Zhouster

+0

'select column_name, column_def as default_val from _v_odbc_columns1 여기서 table_name = 'default_test'이고 column_def는 null이 아닙니다. ' – Niederee

+0

흠, 내가 원하는 명령이 아닙니다. 나는이 열을 null 값으로 대체 한 성명을 기본값의 열로 생각하고있었습니다.이를 위해 기본 키워드가 무엇인지 궁금합니다. – Zhouster