PostgreSQL创建触发器函数:用字段子集更新字段报错求助
PostgreSQL 9触发器函数修复:用字段子集填充目标字段
错误原因分析
- 触发器函数指定了
language sql,但触发器函数必须使用plpgsql语言:SQL语言函数不支持返回TRIGGER类型,也无法处理触发器特有的NEW/OLD行变量,这是你遇到ERROR: SQL functions cannot return type trigger的核心原因。 - 赋值语句错误使用
SET关键字:触发器中给NEW行的字段赋值不需要SET,直接赋值即可。
正确的函数与触发器代码
修正后的触发器函数
CREATE OR REPLACE FUNCTION update_tp_tag_field() RETURNS TRIGGER AS $$ BEGIN -- 直接给NEW字段赋值,无需SET关键字 NEW."telco pole tag" = RIGHT(NEW."structure name", STRPOS(REVERSE(NEW."structure name"), ':') - 1); RETURN NEW; END; $$ LANGUAGE plpgsql; -- 必须指定为plpgsql语言
触发器代码(可直接复用)
CREATE TRIGGER populate_tp_tag_field BEFORE INSERT ON data.PIA_Point_Structures FOR EACH ROW EXECUTE FUNCTION update_tp_tag_field();
额外补充说明
- 关于你测试的简单函数:你只提供了函数体片段,完整的触发器函数必须包含
CREATE OR REPLACE FUNCTION定义、返回类型声明和plpgsql语言指定,否则即使保存成功也无法正确触发执行。 - 边界情况处理:如果
structure name中没有:符号,STRPOS会返回0,导致计算后出现负数,RIGHT函数会报错。可以添加判断逻辑避免异常:
CREATE OR REPLACE FUNCTION update_tp_tag_field() RETURNS TRIGGER AS $$ BEGIN IF STRPOS(REVERSE(NEW."structure name"), ':') > 0 THEN NEW."telco pole tag" = RIGHT(NEW."structure name", STRPOS(REVERSE(NEW."structure name"), ':') - 1); ELSE NEW."telco pole tag" = NEW."structure name"; -- 无冒号时直接赋值原字段,也可设为NULL或自定义默认值 END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;
内容的提问来源于stack exchange,提问作者K. Osborne
相关产品推荐
相关产品推荐

