在Netezza中,如果表是空的,可以使用"Alter table add column not null"命令添加非空列。

8 浏览
0 Comments

在Netezza中,如果表是空的,可以使用"Alter table add column not null"命令添加非空列。

SYSTEM.ADMIN(ADMIN)=> 创建表test(姓名 varchar(20),年龄 int);
创建表成功
SYSTEM.ADMIN(ADMIN)=> 修改表test,添加列dob varchar(20) NOT NULL;

\n错误:ALTER TABLE:在空表中不允许为列“DOB”添加非空约束,除非有默认值。\n在空表中,是否需要在非空约束后指定默认值?\n

SYSTEM.ADMIN(ADMIN)=> 修改表test,添加列dob varchar(20) NOT NULL DEFAULT '0';
修改表成功

\n这是预期的行为吗?

0
0 Comments

在Netezza中,当对表进行alter操作时,会使用版本化表的方法。如果向表中添加列,则实际上在底层会有两个不同的表版本,但对用户来说它们是作为一个表呈现的。

原始表版本(不包含新的NOT NULL DEFAULT列)不会被修改,直到GROOM VERSIONS将这些版本再次合并为一个底层表。这样做的好处是alter操作很快,因为不需要扫描/更新现有行。相反,它会为在原始底层表版本中不存在的列提供DEFAULT值。

当对表进行alter操作以添加具有NOT NULL属性的列时,系统要求提供DEFAULT说明,以便知道如何表示添加的列。无论表是否实际上有任何行,都需要提供这个DEFAULT说明。

好消息是,您可以对新添加的列进行alter操作,以删除该DEFAULT。

最后要注意的是,为了避免由于版本化表的特性导致性能逐渐降低,应尽快对任何版本化表进行groom操作。

在这个例子中,我们可以看到在向表中添加了一个新的列后,该列的默认值为'0'。然后我们对该列进行alter操作,删除了它的默认值。在进行了groom操作后,该表不再是一个版本化表,所有NOT NULL列的值都完全实例化了。

0
0 Comments

在Netezza数据库中,如果要在空表中添加一个非空列,需要指定一个默认值来填充可能存在的空值。下面是一个示例代码:

create table test (name varchar(20), age int);
ALTER TABLE test add column dob varchar(20) NOT NULL default 'a';
ALTER TABLE test ALTER COLUMN dob DROP DEFAULT;

上述代码中,首先创建了一个名为test的表,包含两个列name和age。然后使用ALTER TABLE语句向表中添加了一个名为dob的非空列,并指定了默认值为'a'。最后使用ALTER TABLE语句移除了dob列的默认值。

这种要求在Netezza中是合理的,因为在向空表中添加非空列时,需要为已有的行提供一个默认值以填充空白处。通过指定默认值,可以确保表中的所有行都有有效的值,从而避免出现数据不完整或错误的情况。

参考链接:[How can I add a column to a Postgresql database that doesn't allow nulls?](https://stackoverflow.com/questions/512451)

0