Postgresql触发器将空字符串设置为NULL

Pet*_*zar 2 postgresql triggers

我有一个表MACIDDR类型的字段"mac".现在,当有人插入空字符串而不是mac地址时,我想处理一种情况(可能带有触发器?).我想将此空字符串转为NULL,因此postgresql不会抱怨:类型为macaddr的输入语法无效:""

我现在的触发功能是:

IF CHAR_LENGTH(NEW.mac) = 0 THEN
  NEW.mac := NULL;
END IF;
Run Code Online (Sandbox Code Playgroud)

但它似乎没有用.如果你想在数据库级别处理这个问题,你会怎么做?

非常感谢你.-Jan

PS:我是一个postgresql新手.但一个着迷的:)

mu *_*ort 5

你不能用触发器做你想做的事.执行触发器之前,将解析传入的空字符串并将其转换为macaddr(或至少将尝试解析).但是,您可以编写一个简单的函数将空字符串转换为NULL并在INSERT中使用它:

create function macaddr_ify(m varchar) returns macaddr as $$
begin
    if m is null or length(m) = 0 then
        return null;
    end if;
    return cast(m as macaddr);
end;
$$ language plpgsql;
Run Code Online (Sandbox Code Playgroud)

然后:

insert into t (addr) values (macaddr_ify(str));
Run Code Online (Sandbox Code Playgroud)

我建议您的客户端应用程序正确地将空MAC地址字符串转换为NULL本身.