关于sql:Postgresql upsert查询

Postgresql upsert query

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Insert, on duplicate update (postgresql)
Cannot SELECT from UPDATE RETURNING clause in postgres

帮助理解语法错误。我试图在PosgreSql:

1
2
3
4
5
6
7
8
9
CREATE TABLE tbl( KEY  INT, val INT);

INSERT INTO tbl(KEY,val)
   SELECT DISTINCT(KEY), 0 FROM unnest('{0,1,2,3,4,5}'::INT[]) AS KEY
       WHERE KEY NOT IN (
         UPDATE tbl SET val = 1
             WHERE KEY = any('{0,1,2,3,4,5}'::INT[])
         returning KEY
);

错误是:

1
2
3
4
5
6
7
8
9
ERROR:  syntax error at OR near"tbl"
ROWS 6:  UPDATE tbl SET val = 1
                  ^

********** Error **********

ERROR: syntax error at OR near"tbl"
SQL state: 42601
CHARACTER: 167

但是在不插入部分的情况下更新子查询会很好地工作。

有什么最简单的方法来进行UpSert查询吗?


您的问题被建议为重复的,因为PostgreSQL的解决方案没有upsert命令已经发布,这确实回答了您关于如何实现upsert的问题。

在回答语法错误问题时,您目前不可能尝试这样做。您会发现,在即将到来的PostgreSQL 9.1版本中,可能会有一种变化,它将支持WITH子句中的数据修改语句:http://www.postgresql.org/docs/9.1/static/queries with.html queries-with-modifying