如何用INSERT INTO的RETURNING结果创建TEMP临时表?(含ON CONFLICT场景)
解决PostgreSQL中用INSERT...RETURNING结果创建临时表的问题
你的写法直接用CREATE TEMP TABLE AS跟INSERT语句是行不通的,PostgreSQL不支持这种语法——CREATE TABLE AS只能搭配SELECT类语句,没法直接承接INSERT的返回结果。
针对你带ON CONFLICT DO NOTHING的场景,可行的方案是分两步走:
先创建匹配结构的临时表
你可以直接复制目标表的结构(不含数据),不用手动写列定义,更灵活:CREATE TEMP TABLE my_tmp_table AS SELECT * FROM my_insert_table LIMIT 0;如果只需要
RETURNING里的特定列,也可以手动指定临时表的列结构,比如:CREATE TEMP TABLE my_tmp_table ( my_col TEXT -- 需和my_insert_table的my_col类型保持一致 );执行插入并将返回结果写入临时表
把INSERT...RETURNING的结果作为数据源插入到临时表中,这样只有实际成功插入的行(避开冲突的行)会被存入临时表:INSERT INTO my_tmp_table SELECT * FROM ( INSERT INTO my_insert_table (my_col) SELECT my_col2 FROM my_other_table ON CONFLICT DO NOTHING RETURNING * ) AS inserted_rows;
完成后,临时表my_tmp_table就可以在后续多条语句中重复使用,完全满足你的需求。
内容的提问来源于stack exchange,提问作者Max888
相关产品推荐
相关产品推荐

