Postgres查询传入null值时如何触发列默认值且无需修改代码
PostgreSQL 插入NULL覆盖列默认值问题解决方案
无需修改应用代码的前提下,有两种成熟的处理方案:
方案1:使用BEFORE INSERT触发器(推荐,兼容性最好)
创建插入前触发的行级触发器,当传入对应列的值为NULL时,自动替换为你设置的默认值即可,示例代码如下:
-- 首先创建触发器函数 CREATE OR REPLACE FUNCTION replace_null_with_default() RETURNS TRIGGER AS $$ BEGIN -- 把下面的your_column替换为你实际的列名,your_default_value替换为你配置的默认值 IF NEW.your_column IS NULL THEN NEW.your_column := your_default_value; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; -- 给目标表绑定触发器,your_table替换为实际表名 CREATE TRIGGER trigger_set_default_before_insert BEFORE INSERT ON your_table FOR EACH ROW EXECUTE FUNCTION replace_null_with_default();
如果后续要修改默认值,只需要同步修改触发器函数里的默认值即可,不需要动应用逻辑。
方案2:重写表的INSERT规则
也可以通过PostgreSQL的规则系统,对插入的NULL值做替换,适合需要批量处理多列的场景:
CREATE OR REPLACE RULE rule_replace_null_on_insert AS ON INSERT TO your_table WHERE NEW.your_column IS NULL DO INSTEAD INSERT INTO your_table (col1, col2, your_column) -- 列出所有要插入的列 VALUES (NEW.col1, NEW.col2, your_default_value); -- 对应位置替换默认值
注意:规则系统的调试复杂度比触发器高,非特殊场景优先选择触发器方案。
你提供的列定义和约束配置截图如下:

内容的提问来源于stack exchange,提问作者Hasan Özkaynak
相关产品推荐
相关产品推荐

