我有一个相当大的 PostgreSQL 13 表,我需要添加一个新TEXT
列,对于这个新列,我想添加一个GENERATED ALWAYS
具有以下定义的列:
ALTER TABLE my_table
ADD COLUMN text_col TEXT,
ADD COLUMN text_col__tsvector GENERATED ALWAYS AS (to_tsvector('pt_unaccent', "text_col")) STORED;
然而,当我运行上面的 DDL 时,需要很长时间才能完成。据我了解,这是因为text_col__tsvector
即使是,也需要为表中的所有行运行text_col
表达式NULL
。
我的问题是:知道该列将始终以(未定义默认值)text_col
开头,有没有办法让 postgres 在创建时跳过第一代部分?或者更改列的表达式部分 ( )以忽略值?NULL
text_col__tsvector
to_tsvector('pt_unaccent', "text_col")
GENERATED ALWAYS
NULL
目前(postgresql 16)仅实现了存储的生成列,并且添加此类列始终使用计算和填充的值执行全表重写。没有办法避免这种表重写。
您可以使用触发器而不是生成的列,以老式方式填充字段的值。也有可能您根本不需要新列,而是需要表达式上的索引。可以同时构建表达式索引。