我有一个需要生成的列,它遵循命名模式。每个表的模式都是唯一的,但总是包括某种后缀或前缀,以及其中一些列的当前行值。
-- Create table_registration
ALTER TABLE public.person
DROP COLUMN IF EXISTS entry_name,
ADD COLUMN entry_name TEXT generated ALWAYS as (concat_ws(' ', hobby)) stored;
这有时会触发类似的错误
Npgsql.PostgresException: '42P17: generation expression is not immutable'
然后我意识到这可能不是我想做的,因为它基本上与一个新列相同,并且占用了空间——从基本上做逻辑运算开始。
有没有什么方法可以在不占用空间的情况下生成并修改它,如果这不可能,为什么我不能在添加列后删除它?
从Postgres 12开始,生成的列总是stored
。对virtual
生成的列的支持可能会在未来的版本中实现,这些列的值是动态计算的(因此不占用存储空间(。
一个直接的替代方案是使用view
:
create view person_view as
select p.*, concat_ws(' ', hobby) entry_name
from public.person p