如何使用 Postgres 触发器双重写入一个 table 中的两列?

How to dual write to two columns in one table using Postgres trigger?

我想更改 PostgreSQL 中的列类型。让我们说从 INT 到 VARCHAR。安全的方法如下:

  1. 添加新列new_<column>
  2. 对两列进行双重写入(例如,使用 BEFORE INSERT/UPDATE 触发器)。
  3. 用旧列值的副本回填新列。
  4. 在单个事务和显式 LOCK <table> 语句中将 <column> 重命名为 old_<column> and new_<column>
  5. 删除旧列。

问题是如何创建这个 BEFORE INSERT/UPDATE 触发器? (2)

在这个例子中使用简单的 table foo

CREATE TABLE foo (id int, idstr varchar);

创建一个简单的函数来为您的新列分配一个值 idstr

CREATE OR REPLACE FUNCTION bluegreen ()
        RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
  IF NEW.idstr IS NULL THEN
    NEW.idstr = NEW.id::varchar;
  END IF;
  IF NEW.id IS NULL THEN
    NEW.id = NEW.idstr::int;
  END IF;
  RETURN NEW;
END;
$$;

并使用之前创建的函数在 table 上创建触发器。

CREATE TRIGGER foo_trg
    BEFORE INSERT OR UPDATE ON foo
    FOR EACH ROW
    EXECUTE PROCEDURE bluegreen();

https://www.postgresql.org/docs/current/sql-createtrigger.html 有关触发器的详细信息