postgresql - 触发器在插入/更新时不更新 tsvector

标签 postgresql triggers full-text-search

我正在尝试从几个表中的几列中整理数据,以使其可以全文搜索,但我运气不佳。

这是我的功能:

CREATE OR REPLACE FUNCTION on_customer_save_udpate_tsv() RETURNS trigger AS $$ 
declare 
   tsv_text text; 
begin 
SELECT string_agg(cust_text.text, ' ') as agg_text into tsv_text 
FROM (SELECT concat("name", ' ', "phone") as text 
   FROM "Customers" 
   where "id" = NEW.id 
   UNION 
   SELECT concat("firstName", ' ', "lastName", ' ', "phone", ' ', "email") as text 
   FROM "Contacts" 
   where "customerId" = NEW.id 
   UNION 
   SELECT concat("streetLine1", ' ', "city", ' ', "state", ' ', "zip") as text 
   FROM "Addresses" 
   where "customerId" = NEW.id) cust_text; 
NEW.tsv := to_tsvector(coalesce(tsv_text,'')); 
return NEW; 
end 
$$ LANGUAGE plpgsql; 

这是我的触发器:

CREATE TRIGGER cust_tsv_trigger BEFORE INSERT OR UPDATE 
ON "Customers" FOR EACH ROW EXECUTE PROCEDURE on_customer_save_udpate_tsv();

但是,插入/更新后“Customers”.tsv 列为空。

当我手动运行大部分函数时,它按预期工作。

DO $$ 
declare 
   tsv_text text; 
begin 
SELECT string_agg(cust_text.text, ' ') as agg_text into tsv_text 
FROM (SELECT concat("name", ' ', "phone") as text 
   FROM "Customers" 
   where "id" = 17 
   UNION 
   SELECT concat("firstName", ' ', "lastName", ' ', "phone", ' ', "email") as text 
   FROM "Contacts" 
   where "customerId" = 17
   UNION 
   SELECT concat("streetLine1", ' ', "city", ' ', "state", ' ', "zip") as text 
   FROM "Addresses" 
   where "customerId" = 17) cust_text; 

   UPDATE "Customers"
   SET tsv = to_tsvector(coalesce(tsv_text, ''))
   WHERE "id" = 17;
end 
$$ LANGUAGE plpgsql; 

我对 postgres 还很陌生。我错过了什么?

最佳答案

当触发器在 INSERT 或 UPDATE 之前运行时,让它从表中选择以获取新值是有缺陷的,因为新值尚不存在。

考虑查询的这一部分:

SELECT concat("name", ' ', "phone") as text 
   FROM "Customers" 
   where "id" = NEW.id 

在 INSERT 的情况下,您将始终在此处获得 NULL,而在 UPDATE 的情况下,您将获得将要替换的值而不是新值。

应该使用以下代码来替代上述代码:

SELECT (NEW.name || ' ' || NEW.phone) AS text

看起来可疑的另一点是:如果 3 个表中任何一个的用户详细信息中的任何字段为 NULL,则整个连接的内容将为空,因为代码应用了 coalesce 在最后而不是在每个单独的字段上执行。

关于postgresql - 触发器在插入/更新时不更新 tsvector,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32859241/

相关文章:

sql - 将 PostgreSQL 表中的特定行导出为 INSERT SQL 脚本

python - mySQL 触发器在控制台插入后起作用,但在脚本插入后不起作用

mysql - 如何创建触发器(Mysql)

java - Spring Boot 到 Postgres 数据库 - 驱动程序问题

postgresql - Postgres 在运行 Select 查询时不返回任何数据

triggers - 可以使用触发器调用Azure容器实例吗?

sql - 使用 setweight() 时 Postgres 全文搜索错误

SQL Server CONTAINSTABLE 不适用于单个数字

javascript - Mongoose ,nodejs,全文搜索

ruby-on-rails - Rails 数据库查询以查找和排序帖子