生成的列不占用空间



我有一个需要生成的列,它遵循命名模式。每个表的模式都是唯一的,但总是包括某种后缀或前缀,以及其中一些列的当前行值。

-- 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

最新更新