如何创建 PostgreSQL 触发器来为另一列插入值?

如何创建 PostgreSQL 触发器来为另一列插入值?

这是我的情况:我有一个用于存储电子邮件地址的 PostgreSQL 表,有时电子邮件地址包含地址扩展名[email protected],我想创建一个触发器来将没有扩展名的地址存储在另一列中。

  • SQL 列:email、email_raw(不带地址扩展)。
  • 我尝试使用这个函数和触发器,但它不起作用:
创建或替换函数 strip_addr_extension() 返回触发器为 $$
开始
    如果(NEW.email LIKE'%+%')则
        NEW.email_raw := split_part(NEW.email, '+', 1) || '@' || split_part(NEW.email, '@', -1);
    别的
        NEW.email_raw := NEW.email;
    万一;
    返回新品;
结尾;
$$ 语言 plpgsql;

创建触发器 maddr_email_raw
    在 maddr 上插入之前
    对于每一行
    执行程序strip_addr_extension();

当我插入新记录时,会出现错误:

SQL> 插入 maddr(电子邮件)值('[电子邮件保护]');

错误:函数 split_part(bytea,unknown,integer) 不存在
第 1 行:选择 split_part(NEW.email,'+',1) ||'@'|| split_part(NE...
               ^
提示:没有函数与给定的名称和参数类型匹配。您可能需要添加显式类型转换。
查询:选择 split_part(NEW.email,'+',1) ||'@' || split_part(NEW.email,'@',-1)
上下文:PL/pgSQL 函数 strip_addr_extension() 第 4 行赋值

有什么问题?我该如何解决?谢谢。:)

答案1

错误:函数 split_part(bytea,unknown,integer) 不存在

此错误消息表明该email列的类型为bytea,通常用于二进制数据。

文本函数不能使用二进制参数,因为它们不能假设一系列字节背后存在具有有效编码(以及哪一个)的文本。

考虑将数据类型更改为text或动态转换为具有byteatextconvert_from(string bytea, src_encoding name)功能。

相关内容