在 Postgres 中保持一列与另一列同步

Nik*_*des 2 sql postgresql triggers

我想知道是否可以让一列始终与同一个表中的另一列保持同步

以此表为例:

+------+-----------+
| name | name_copy |
+------+-----------+
| John | John      |
+------+-----------+
| Mary | Mary      |
+------+-----------+
Run Code Online (Sandbox Code Playgroud)

我想:

能够INSERT进入此表,仅使用为列提供值name- 该name_copy列应自动采用我在其中使用的值name

当在预先存在的行上UPDATE添加列时,应该自动更新以匹配新的和更新的。namename_copyname_column

一些解决方案

  • 我可以通过代码来完成此操作,但这会非常糟糕,因为无法保证我的代码始终可以访问数据(如果有人通过数据库客户端更改数据怎么办?)

在 Postgres 中解决这个问题的安全可靠且简单的方法是什么?

kli*_*lin 5

您可以创建一个触发器。简单的触发功能:

create or replace function trigger_on_example()
returns trigger language plpgsql as $$
begin
    new.name_copy := new.name;
    return new;
end
$$;
Run Code Online (Sandbox Code Playgroud)

Postgres 12+中,有一个很好的替代方案,即生成列的形式。

create table my_table(
    id int, 
    name text, 
    name_copy text generated always as (name) stored);
Run Code Online (Sandbox Code Playgroud)

请注意,无法直接写入生成的列。

在 db<>fiddle 中测试这两个解决方案