Mar*_*ius 7 postgresql computed-column
如何更改 Postgres 12 GENERATED 列的定义?
CREATE TABLE test (
id serial PRIMARY KEY,
val_a int4 NOT NULL DEFAULT 0,
val_b int4 NOT NULL DEFAULT 0,
val_sum int4 generated always AS (val_a + val_b) stored
);
Run Code Online (Sandbox Code Playgroud)
我试过
ALTER TABLE test ALTER COLUMN val_sum TYPE int4 generated always AS (val_a + val_b + 1) stored;
ALTER TABLE test ALTER COLUMN val_sum SET generated always AS (val_a + val_b + 1) stored;
Run Code Online (Sandbox Code Playgroud)
但两者都会出现语法错误。
另一种方法是删除并添加列,这是可行的,但我想知道如何像任何其他列一样简单地更改它。
Postgres >= 17
Postgres 17 添加了一个新的ALTER TABLE
子命令,即ALTER COLUMN ... SET EXPRESSION
所以我想我们将能够:
ALTER TABLE test ALTER COLUMN val_sum SET EXPRESSION AS (val_a + val_b + 1) ;
Run Code Online (Sandbox Code Playgroud)
相关阅读:
Pre postgres 17 目前作为一种可能的解决方法,您可以删除该列并再次添加它吗?
ALTER TABLE test drop COLUMN val_sum;
ALTER TABLE test add COLUMN val_sum int4 generated always AS (val_a + val_b + 1) stored;
Run Code Online (Sandbox Code Playgroud)
警告:Postgres 表的列数限制为 1600,删除的列仍计入此限制。如果达到限制,您需要删除并重新创建表,或者使用https://reorg.github.io/pg_repack/等工具为您清理表。
我不确定这是正确的答案,但阅读关于 ALTER TABLE的文档我会说:不,你不能。
其中 action 是以下之一:
添加 [COLUMN] [IF NOT EXISTS] column_name data_type [COLLATE collation] [ column_constraint [...]]
and column_constraint is:
[ CONSTRAINT constraint_name ]
{ NOT NULL |
NULL |
CHECK ( expression ) [ NO INHERIT ] |
DEFAULT default_expr |
GENERATED ALWAYS AS ( generation_expr ) STORED |
GENERATED { ALWAYS | BY DEFAULT } AS IDENTITY [ ( sequence_options ) ] |
UNIQUE index_parameters |
PRIMARY KEY index_parameters |
REFERENCES reftable [ ( refcolumn ) ] [ MATCH FULL | MATCH PARTIAL | MATCH SIMPLE ]
[ ON DELETE referential_action ] [ ON UPDATE referential_action ] }
[ DEFERRABLE | NOT DEFERRABLE ] [ INITIALLY DEFERRED | INITIALLY IMMEDIATE ]
Run Code Online (Sandbox Code Playgroud)
似乎允许column_constraint的唯一命令是 ADD COLUMN
实际上,您可以向计算列添加约束名称:
val_sum int4 CONSTRAINT GA_test generated always AS (val_a + val_b) stored
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3748 次 |
最近记录: |