2017-10-05 80 views
0

我有列的表格:刪除行更新,如果衝突

  • microservice_id
  • transport_id
  • is_default
  • ...

和唯一的密鑰(microservice_id, transport_id) 我試過查詢

UPDATE microservices_transports 
SET 
    transport_id = :next, 
    username  = :username, 
    password  = :password, 
    is_default = COUNT((SELECT * 
        FROM 
         (DELETE FROM microservices_transports AS mt WHERE mt.transport_id = :NEXT AND mt.microservice_id = microservice_id RETURNING *) 
        WHERE is_default = TRUE 
        )) > 0 
WHERE 
transport_id = :prev 

主要想法是在更新之前刪除所有衝突行,但DELETE子查詢將無法工作。我該如何解決它?

[42601] ERROR: syntax error at or near "FROM"

附近DELETE

+0

怎麼不工作?錯誤? –

+0

你會得到什麼錯誤? –

+0

* [42601]錯誤:在DELETE附近的「FROM」*附近出現語法錯誤,因爲我認爲 – Illorian

回答

0

我想嘗試重構聲明:

數據:

t=# select * from a; 
i 
--- 
1 
(1 row) 

水木清華喜歡你:

t=# begin; update a set i = (select count(*) from (delete from a returning *)); 
BEGIN 
ERROR: syntax error at or near "from" 
LINE 1: update a set i = (select count(*) from (delete from a return... 

重構:

t=# with d as (delete from a where i = 1 returning *) 
, c as (select count(*) from d) 
update a set i = c.count from c; 
UPDATE 0