PostgreSQL插入数据后,如何创建触发器用列值更新指定列?
解决PostgreSQL触发器自动处理stripped字段的问题
原代码的问题点:
- 函数返回类型拼写错误:把
trigger写成了tigger,会导致函数创建失败 - 触发器时机错误:
after insert是在数据插入后触发,此时修改NEW变量无法影响已插入的行,必须用before insert在插入前修改行数据 - 触发器级别错误:
for each statement级别的触发器无法访问单条行的NEW数据,必须用for each row做逐行处理 - 正则表达式冗余:字符类中的
|是多余的(字符类里的|就是普通字符,不是逻辑或),可简化为[- .\/]
修正后的完整代码:
-- 创建处理函数,修正拼写错误 create or replace function strip_vol() returns trigger as $$ begin -- 去除指定符号并转小写,优化正则表达式 new.stripped_columnA := lower(REGEX_REPLACE(new.columnA, '[- .\/]', '', 'g')); new.stripped_columnB := lower(REGEX_REPLACE(new.columnB, '[- .\/]', '', 'g')); return new; end $$ language plpgsql; -- 创建BEFORE级别的行触发器 create trigger abc_trigger before insert on tableA for each row execute procedure strip_vol();
导入CSV的注意事项:
用psql的COPY命令导入时,触发器会自动触发处理stripped_columnA和stripped_columnB,无需额外操作。示例COPY命令:
psql -d your_database -c "COPY tableA (columnA, columnB) FROM '/path/to/your/file.csv' DELIMITER ',' CSV HEADER;"
内容的提问来源于stack exchange,提问作者Franklin Raja
相关产品推荐
相关产品推荐

