【问题标题】:Generated column without taking up space生成列不占用空间
【发布时间】:2020-04-25 18:01:12
【问题描述】:

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

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

然后我意识到这可能不是我想做的,因为它基本上与新列相同并且占用空间 - 从基本上做逻辑操作。

有没有什么办法可以生成这个 - 并在不占用空间的情况下修改它,如果这不可能,为什么我不能在添加列后删除它?

【问题讨论】:

    标签: sql postgresql calculated-columns create-table


    【解决方案1】:

    从 Postgres 12 开始,生成的列始终为 stored。未来版本可能会支持virtual 生成的列,其值是动态计算的(因此不占用存储空间)。

    直接的替代方法是使用view

    create view person_view as
    select p.*, concat_ws(' ', hobby) entry_name
    from public.person p
    

    【讨论】:

    • 如果模式发生变化,我仍然需要删除视图。当我这样做时,我遇到了与 generation expression is not immutable 相同的问题 - 我该如何克服这个问题?
    猜你喜欢
    • 2021-10-23
    • 2018-10-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-06
    • 2021-01-21
    • 2020-07-08
    • 2019-12-14
    • 1970-01-01
    相关资源
    最近更新 更多