sql - 保持列与 Postgres 中的另一列同步

标签 sql postgresql triggers

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

以这张表为例:

+------+-----------+
| name | name_copy |
+------+-----------+
| John | John      |
+------+-----------+
| Mary | Mary      |
+------+-----------+

我愿意:

能够INSERT到这个表中,只为name列提供一个值——name_copy列应该自动取值我在 name

中使用

UPDATE-ing 预先存在的行上的 name 列时,name_copy 应该自动更新以匹配新的和更新的 name_column.

一些解决方案

  • 我可以通过代码做到这一点,但那会非常糟糕,因为不能保证我的代码始终可以访问数据(如果有人通过数据库客户端更改数据怎么办?)

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

最佳答案

您可以创建一个 trigger .简单的触发函数:

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

Postgres 12+ 中有一个很好的替代形式 generated columns.

create table my_table(
    id int, 
    name text, 
    name_copy text generated always as (name) stored);

请注意,不能直接写入生成的列。

db<>fiddle. 中测试这两种解决方案

关于sql - 保持列与 Postgres 中的另一列同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40900861/

相关文章:

PHP PDO ODBC - 数据类型在等于运算符中不兼容

PHP 从数据库中解码 JSON 字符串返回 NULL

postgresql - 如何将时间戳列映射到 JPA 类型?

postgresql - 在 PostgreSQL 中重复更新时插入?

mysql - 使用触发器进行差异化的通用日志记录

sql - ScalaQuery 多对多

php - 数据库中具有相同值的组列名称

java - 是否有可以在 Java(或 PostgreSQL)中使用的良好的 XML-to-Table?

sql - 为什么这个MySQL触发器会导致堆栈溢出?

mysql - MySQL 中的跨表更新