PostgreSQL中如何在DO-IF-INSERT语句内执行SELECT语句
问题修复方案
核心错误原因
你编写的代码出现问题是因为混用了INSERT的两种语法:
- 插入固定值使用
INSERT INTO 表(字段) VALUES (值列表) - 从查询结果插入数据不需要加
VALUES关键字,直接使用INSERT INTO 表(字段) SELECT 查询语句
同时判断表是否为空时用SELECT count(*)会全表扫描计数,大表场景下性能较差,推荐用EXISTS语法,只要查到存在任意一行数据就立刻返回结果,执行效率更高。
可直接运行的优化后代码
DO $$ BEGIN -- 判断本地crit_crashes表是否存在数据 IF EXISTS (SELECT 1 FROM crit_crashes) THEN -- 直接从本地表查询结果插入全局表,显式指定字段避免表结构变更导致报错 INSERT INTO usr_wrk.crit_crashes (sd, title, business_line, start_dttm, end_dttm, category, date_opened) SELECT sd, title, business_line, start_dttm, end_dttm, category, date_opened FROM crit_crashes; ELSE -- 本地表为空时插入默认值 INSERT INTO usr_wrk.crit_crashes (sd, title, business_line, start_dttm, end_dttm, category, date_opened) VALUES (NULL, NULL, NULL, NULL, NULL, NULL, CURRENT_DATE); END IF; END $$;
注意事项
- 请确认本地
crit_crashes表的sd、title、business_line、start_dttm、end_dttm、category、date_opened字段类型和顺序与目标表usr_wrk.crit_crashes完全一致 - 如果两个表字段顺序完全匹配,也可以用
SELECT *简写,但显式指定字段兼容性更好,后续表结构增删字段时不会出现插入错位问题 - 用
$$美元符包裹PL/pgSQL代码块可以避免内部单引号转义问题,比原始单引号包裹的写法更易维护
内容的提问来源于stack exchange,提问作者allin
相关产品推荐
相关产品推荐

