如何更改 Postgres 12 GENERATED 列的定义

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)

但两者都会出现语法错误。

另一种方法是删除并添加列,这是可行的,但我想知道如何像任何其他列一样简单地更改它。

jam*_*one 7

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/等工具为您清理表。


McN*_*ets 5

我不确定这是正确的答案,但阅读关于 ALTER TABLE的文档我会说:不,你不能。

其中 action 是以下之一:

添加 [COLUMN] [IF NOT EXISTS] column_name data_type [COLLATE collat​​ion] [ 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)

  • 我相信OP正在尝试修改生成公式。 (2认同)