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