【发布时间】:2012-10-29 22:06:50
【问题描述】:
有什么方法可以在 Netezza 中将不可为空的列更改为可空的? (或者我必须在表中创建一个新的可空列,将数据传输过来,然后删除旧列?)
很抱歉,如果通过 google 搜索显示答案,我已尝试查找但无法找到。
【问题讨论】:
有什么方法可以在 Netezza 中将不可为空的列更改为可空的? (或者我必须在表中创建一个新的可空列,将数据传输过来,然后删除旧列?)
很抱歉,如果通过 google 搜索显示答案,我已尝试查找但无法找到。
【问题讨论】:
除了添加/删除列本身、设置或清除默认值、更改 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;
【讨论】:
CREATE TABLE ..,然后是 INSERT INTO,然后是 DROP 旧表和 ALTER TABLE x RENAME最后的。这样,您可以最大限度地减少哪个表不可用的持续时间。删除和重命名是非常即时的。