2016-08-21 59 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 *; 

這將更新所有內容!或者如果它不存在就創建一個。