Netezza - 使用默认值nzload数据

时间:2014-07-14 21:36:13

标签: sql file-upload default-value netezza

我正在尝试将int数据加载到Netezza服务器上的表中。但是,我不知道在不存在或为空的情况下如何使用默认值加载数据。

现在,该表由两列组成,两列都有自己的默认值。

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

我目前正在运行以下nzload命令:nzload -cf test.log

test.log文件如下所示:

DATAFILE /usr/me/test.dat
{
    Database     test
    TableName    numberTest
    Delimiter    '|'
}

test.dat文件如下所示:

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

我面临的问题是,当命令运行正常时,整数值默认为Null,而不是默认值设置的值。我尝试在nzsql中使用insert,并创建了正确的默认值,但我想知道是否有办法使用nzload执行此操作。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

Netezza不会强制执行default value约束。它仅用于表示法。 IBM Documentation。为了修复您的表,您必须运行update语句。

答案 1 :(得分: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或空字符串,也不会触发默认值。

[nz@netezza 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在其插入中引用该列,因此不能/不应使用默认值。它正如我所期望的那样工作,但是如果你能告诉nzload将NULL或空字符串转换为列的默认值肯定会有用。不幸的是,目前还没有这种功能(至少我不知道)。

虽然这是一个超级大笨蛋,但我通过手动执行外部表并分两步加载来解决数据加载问题。

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)