【问题标题】:Recompute values in Postgres generated column after underlying function changed基础函数更改后重新计算 Postgres 生成列中的值
【发布时间】:2020-10-30 18:34:48
【问题描述】:

用这样的生成列对表进行映像:

CREATE OR REPLACE FUNCTION extract_first_name(p_name text) RETURNS text
LANGUAGE SQL IMMUTABLE
AS $$
    SELECT split_part(p_name, ' ', 1);
$$;

CREATE TABLE customers (
    id serial,
    name text,
    first_name text GENERATED ALWAYS AS (extract_first_name(name)) STORED
);

后来有人发现extract_first_name这个函数太简单了,需要改一下。然后更新,但first_name 列中的值保持不变。我们如何以最简单和最有效的方式重新计算first_name 列中的所有值,以使用最新版本的函数而不锁定表?

【问题讨论】:

    标签: sql postgresql sql-function generated-columns


    【解决方案1】:

    根据 2 个事件“计算”生成的列。插入行和更新基础列的时间。因此,您需要使用 something like 更新每一行

    Update customers 
       set name = name; 
    

    这将根据需要更新表中的每一行。但是由于 Postgres 使用 MVCC 模型,这不会阻止其他人在操作期间进行选择。

    使用并发控制的MVCC模型的主要优势 而不是锁定是在 MVCC 中为查询而获取的锁 (读取)数据与写入数据获取的锁不冲突, 所以阅读永远不会阻碍写作,写作永远不会阻碍阅读。 即使在提供最严格的 通过使用创新的事务隔离级别 可序列化快照隔离 (SSI) 级别。

    但是,如果您在此过程中继续允许更新,则需要注意死锁。

    【讨论】:

    • 添加生成的列时也会计算。
    猜你喜欢
    • 2022-11-11
    • 1970-01-01
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-18
    • 2010-11-18
    相关资源
    最近更新 更多