0

我有这样的桌子

 id | col1 | col2

我需要写触发器:插入或更新列后col1,我需要在列中插入(更新)相同的值col2

这是我的触发功能:

CREATE FUNCTION  upd () RETURNS TRIGGER AS '
   BEGIN 
       UPDATE mytable SET
       col2 =  col1;
       RETURN NULL;
   END;
'
LANGUAGE plpgsql;

这是自触发:

CREATE TRIGGER upd_trigger
AFTER INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE upd()

这不起作用,因为在UPDATE事件中发生了旋风,对吗?

这样做的正确语法是什么?

4

3 回答 3

1

您不需要更新,只需分配值:

CREATE FUNCTION  upd () RETURNS TRIGGER AS 
$body$
   BEGIN 
      new.col2 := to_tsvector(new.col1);
      RETURN new;
   END;
$body$
LANGUAGE plpgsql;

您需要在前触发器中执行此操作:

CREATE TRIGGER upd_trigger
BEFORE INSERT OR UPDATE ON mytable
FOR EACH ROW
EXECUTE PROCEDURE upd()

编辑

正如@DavidAldridge 在他的评论中指出的那样,直接索引 ts_vector() 可能更容易:

create index col1_vector 
    on mytable (to_tsvector(col1)) 
    using gin;

使用查询

where to_tsvector(col1) = '...'

然后将能够使用该索引。

于 2013-05-12T13:13:44.200 回答
1

@a_horse 和 @David 已经为您的案例指出了带有 GIN 索引的卓越解决方案。

但是关于原始问题的答案还有一件事:由于您只需要 trigger after inserting or updating column col1,因此您应该使用更具体的 event UPDATE OF ...,自 Postgres 9.0 起可用:

CREATE TRIGGER upd_trigger
BEFORE INSERT OR UPDATE OF col1 ON mytable
FOR EACH ROW
EXECUTE PROCEDURE upd()

AFTER这样,您甚至可以在触发器中防止无限循环/递归(您称之为“旋风”) 。但是使用BEFORE触发器通常更明智,例如已经提供的@a_horse。

于 2013-05-12T22:07:26.683 回答
0

好吧,如果 col2 的值在确定性上仅取决于 col1 的值,则根本不应该存储 col2。

于 2013-05-12T12:02:50.403 回答