如何使用 Postgres 触发器双重写入一个 table 中的两列?
How to dual write to two columns in one table using Postgres trigger?
我想更改 PostgreSQL 中的列类型。让我们说从 INT 到 VARCHAR。安全的方法如下:
- 添加新列
new_<column>
。
- 对两列进行双重写入(例如,使用
BEFORE INSERT/UPDATE
触发器)。
- 用旧列值的副本回填新列。
- 在单个事务和显式
LOCK <table>
语句中将 <column>
重命名为 old_<column>
and new_<column>
。
- 删除旧列。
问题是如何创建这个 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 有关触发器的详细信息
我想更改 PostgreSQL 中的列类型。让我们说从 INT 到 VARCHAR。安全的方法如下:
- 添加新列
new_<column>
。 - 对两列进行双重写入(例如,使用
BEFORE INSERT/UPDATE
触发器)。 - 用旧列值的副本回填新列。
- 在单个事务和显式
LOCK <table>
语句中将<column>
重命名为old_<column>
and new_<column>
。 - 删除旧列。
问题是如何创建这个 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 有关触发器的详细信息