UPSERT查询重复而不是覆盖

时间:2016-08-21 05:43:16

标签: postgresql

我正在尝试upsert一个查询。 (如果不存在则基本插入或如果已存在值则更新)。 Postgres:9.3.5

这是我的表:

box=> \d timeranges
Table "ana.timeranges"
 Column | Type | Modifiers 
--------+------+-----------
 value  | text | 

我只想更新'value'列。(如果条目存在或创建新条目)

我正在按照本指南编写upsert查询:

  

http://www.the-art-of-web.com/sql/upsert/

这是我的疑问:

WITH upsert AS (UPDATE timeranges SET value=value WHERE value='abc' RETURNING *) 
     INSERT INTO timeranges (value) SELECT 'abc' WHERE NOT EXISTS (SELECT * FROM upsert);

第二次查询:

WITH upsert AS (UPDATE timeranges SET value=value WHERE value='abc3' RETURNING *) 
     INSERT INTO timeranges (value) SELECT 'abc3' WHERE NOT EXISTS (SELECT * FROM upsert);

预期结果 会有abc3而不是abc1。 (我想覆盖它)

我不明白出了什么问题。当我从'abc'更改为'abc2'创建重复条目

box=> select * from timeranges;
 value 
-------
 abc
 abc3
(2 rows)

我以为它应该覆盖它?我只是想覆盖以前的条目

请帮我解决我出错的地方。

感谢您的时间!

1 个答案:

答案 0 :(得分:0)

感谢@Abelisto和SO:我修复了查询。

这就是我用过的。

        WITH upsert AS (UPDATE timeranges SET value=? RETURNING *)
        INSERT INTO timeranges (value) SELECT ? WHERE NOT EXISTS (SELECT * FROM upsert) RETURNING *;

这会更新一切!或者如果它不存在则创建一个。

相关问题