在 Netezza 中将 NOT NULL 约束更改为 NULL

Posted

技术标签:

【中文标题】在 Netezza 中将 NOT NULL 约束更改为 NULL【英文标题】:Change NOT NULL constraint to NULL in Netezza 【发布时间】:2012-10-29 22:06:50 【问题描述】:

有什么方法可以在 Netezza 中将不可为空的列更改为可空的? (或者我必须在表中创建一个新的可空列,将数据传输过来,然后删除旧列?)

很抱歉,如果通过 google 搜索显示答案,我已尝试查找但无法找到。

【问题讨论】:

【参考方案1】:

除了添加/删除列本身、设置或清除默认值、更改 varchar 的长度以及重命名列之外,您无法更改 NZ 6.0 中的列。

您可能必须创建一个新列、移动数据、删除旧列。 对于一张小桌子,这应该没问题。

ALTER TABLE t RENAME COLUMN c to c_old; 

ALTER TABLE t ADD COLUMN (c bigint);

UPDATE t set c = c_old;

ALTER TABLE t DROP COLUMN c_old CASCADE;

但是,如果表很大:

由于 netezza 执行更新语句的方式,创建一个全新的表并移动数据可能会更好。 NZ 之后要求对原始表进行整理,以删除旧版本的更新记录。

CREATE TABLE t_new ( c bigint ) DISTRIBUTE ON (c);

INSERT INTO t_new SELECT c FROM t;

ALTER TABLE t RENAME to t_old;

ALTER TABLE t_new RENAME to t;

DROP TABLE t_old;

【讨论】:

感谢您的回复 :) (只是出于好奇,如何在 netezza 中创建一个包含所有这些行的新表比更新行更快......这似乎有点不直观) Netezza 实际上并没有就地更新行。相反,它只是在您进行更新时插入新行作为该行的新“版本”,并隐藏旧行。在做整个表时,你基本上是在做 100% 的新插入。但是,您仍然有那些必须使用 GROOM TABLE 命令删除的“隐藏”行。然后在更新整个表格时,创建一个新表格更有意义,因为您不必担心修饰。 我也会推荐 CTAS 路线,但是如果您正在执行此操作 - 您可以考虑先执行 CREATE TABLE ..,然后是 INSERT INTO,然后是 DROP 旧表和 ALTER TABLE x RENAME最后的。这样,您可以最大限度地减少哪个表不可用的持续时间。删除和重命名是非常即时的。

以上是关于在 Netezza 中将 NOT NULL 约束更改为 NULL的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Netezza 中将整数字段转换为日期?

在 Netezza 中将带分数转换为浮点数

在netezza sql中将整数转换为二进制

将 java.sql.date 传递给 netezza jdbc 驱动程序

Oracle 到 Netezza 的迁移 - Connect Prior ...开始在 Netezza 中等效

无法在 netezza 中创建表