【发布时间】:2014-08-28 04:28:16
【问题描述】:
我想创建每次更改任何列时都会触发的触发器 - 无论是新更新的还是新插入的。我创造了这样的东西:
CREATE TRIGGER textsearch
BEFORE INSERT OR UPDATE
ON table
FOR EACH ROW
EXECUTE PROCEDURE trigger();
trigger() 函数的主体是:
BEGIN
NEW.ts := (
SELECT COALESCE(a::text,'') || ' ' ||
COALESCE(b::int,'') || ' ' ||
COALESCE(c::text,'') || ' ' ||
COALESCE(d::int, '') || ' ' ||
COALESCE(e::text,'')
FROM table
WHERE table.id = new.id);
RETURN NEW;
END
我希望很清楚我想要做什么。
我的问题是触发器仅在更新时触发,而不是在插入时触发。我猜这不起作用,因为我有 BEFORE INSERT OR UPDATE,但是如果我将其更改为 AFTER INSERT OR UPDATE 那么它既不适用于 INSERT 也不适用于 UPDATE。
【问题讨论】:
-
不,我想插入所有数据并连接所有列并将其保存在另一列中。
-
不要使用
select。直接使用new记录中的值。 -
@a_horse_with_no_name 类似
NEW.ts = NEW.a || ' ' || NEW.b || ' ' || ... ? -
正确。
concat_ws(' ', new.a, new.b, new.c, ...)会更短一些,并且可以正确处理 NULL。
标签: sql postgresql