Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 触发器中的循环_Postgresql_Triggers - Fatal编程技术网

Postgresql 触发器中的循环

Postgresql 触发器中的循环,postgresql,triggers,Postgresql,Triggers,我有这样的桌子 id | col1 | col2 我需要写入触发器以便:在插入或更新列col1之后,我需要在列col2中插入(更新)相同的值 这是我的触发函数: CREATE FUNCTION upd () RETURNS TRIGGER AS ' BEGIN UPDATE mytable SET col2 = col1; RETURN NULL; END; ' LANGUAGE plpgsql; 这是自触发: CREATE TR

我有这样的桌子

 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
事件中发生循环,对吗


执行此操作的正确语法是什么?

如果col2的值确定地仅依赖于col1的值,则col2不应被存储。

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

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()
使用

where to_tsvector(col1) = '...'

然后可以使用该索引。

@a_horse和@David已经为您的案例指出了使用GIN索引的更好解决方案

但是关于原始问题的答案还有一件事:因为插入或更新col1列后只需要触发器
,所以应该使用更具体的事件,从Postgres 9.0开始提供:

创建触发器upd\U触发器
在mytable上插入或更新col1之前
每行
执行过程upd()


这样,您甚至可以在
之后的
触发器中防止无休止的循环/递归(您称之为“循环”)。但通常在触发器之前使用
,比如已经提供的@a_horse,

col2
用于保存
tsvector
数据,原始数据保存在
col1
,(用于全文搜索)。但问题是,为了澄清,我不写这篇文章。你看过在ts_向量(col1)上创建gin索引吗?
的更新对我很有帮助,谢谢。但是
之前
触发器不起作用,
之后
起作用,为什么?我的触发功能出了什么问题?@OTARIKI:很难说。我们需要完整的图片。也许其他触发因素会干扰?你试过马提供的改进触发功能吗?
where to_tsvector(col1) = '...'
CREATE TRIGGER upd_trigger
BEFORE INSERT OR UPDATE OF col1 ON mytable
FOR EACH ROW
EXECUTE PROCEDURE upd()