gpt4 book ai didi

postgresql - 在 Postgres 触发器中使用 tsvector 更新触发器

转载 作者:行者123 更新时间:2023-11-29 11:15:36 24 4
gpt4 key购买 nike

我有一个 tsvector 列,我想在行更改时更新它。对于 INSERT 我正在使用这个触发器:

CREATE TRIGGER albums_vector_insert BEFORE INSERT
ON albums
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger('search_vector', 'pg_catalog.english', 'name')

这看起来很好用。我想在 UPDATE 子句上使用另一个触发器,但我只希望它在名称实际更改时触发,所以我不会浪费周期来不必要地更新搜索向量。我试过这个:

CREATE TRIGGER albums_vector_update BEFORE UPDATE ON albums
FOR EACH ROW EXECUTE PROCEDURE
IF NEW.name <> OLD.name THEN
tsvector_update_trigger(search_vector, 'pg_catalog.english', name);
END IF;

但是当我尝试创建触发器时会抛出 2 个错误:

Error : ERROR:  syntax error at or near "NEW"
LINE 3: IF NEW.name <> OLD.name THEN
^
Error : ERROR: syntax error at or near "IF"
LINE 1: END IF
^

据我了解,如果我使用触发过程语法,ala:

创建或替换函数 something() 返回触发器

然后将我的函数与触发器相关联,然后我将无法使用内置的 tsvector_update_trigger 函数,并且需要自己处理 ts_vector 操作。因此我尝试使用多合一触发器+过程语法...

有什么想法吗?

最佳答案

这是我最终得到的:

CREATE FUNCTION albums_vector_update() RETURNS TRIGGER AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
new.search_vector = to_tsvector('pg_catalog.english', COALESCE(NEW.name, ''));
END IF;
IF TG_OP = 'UPDATE' THEN
IF NEW.name <> OLD.name THEN
new.search_vector = to_tsvector('pg_catalog.english', COALESCE(NEW.name, ''));
END IF;
END IF;
RETURN NEW;
END
$$ LANGUAGE 'plpgsql';


CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON albums
FOR EACH ROW EXECUTE PROCEDURE albums_vector_update();

关于postgresql - 在 Postgres 触发器中使用 tsvector 更新触发器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6784005/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com