2016-08-21 78 views
0

我试图插入查询。 (如果什么都不存在,基本上插入或者如果已经有值,则更新)。 Postgres的:9.3.5UPSERT查询重复而不是覆盖

这是我的表:

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

我只是想更新 '价值' 栏。(如果条目存在或创建新条目)

我按照本指南编写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) 

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

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

谢谢你的时间!

+0

这两个查询:'... SET value = value ...'不明显。第二个查询:'... WHERE value ='abc3'...'在第一个查询之后现在有'abc3'值的条目,因此新条目按照预期创建。 – Abelisto

+0

那么,如何修改查询以便我可以覆盖新值?而不是创建一个新的? – TechnoCorner

+0

'WITH upsert AS(UPDATE timeranges SET value ='new-value'WHERE value ='old-value'RETURNING *) INSERT INTO timeranges(value)SELECT'new-value'WHERE NOT EXISTS(SELECT 1 FROM upsert); ' – Abelisto

回答

0

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

这是我用过的。

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

这将更新所有内容!或者如果它不存在就创建一个。