2014-09-20 61 views
0

我有以下查詢:獨特contraint違反更新的聲明

UPDATE "PostsTags" 
SET "TagId" = "PostsTags"."TagId" #tgs."mainId" 
FROM (
    SELECT t1."TagId" AS "mainId", t1.text AS "mainText", t2."TagId" AS "malformedId", t2.text AS "malformedText" 
    FROM "TagTranslations" t1 
    INNER JOIN "TagTranslations" t2 ON t1.text = regexp_replace(t2.text, '^\s+','') AND t2.id != t1.id 
    WHERE regexp_replace(t1.text, '^\s+','') = t1.text AND t1."language" = 'en-us' 
) tgs 
WHERE "PostsTags"."TagId" = tgs."malformedId" AND "PostsTags"."language" = 'en-us' AND "PostsTags"."PostId" = 281 
RETURNING * 

正如你可以看到我更新TagId = TagId(我設置相同的值,標籤識別列)。我得到以下錯誤:

ERROR: duplicate key value violates unique constraint "PostsTags_pkey" 
DETAIL: Key (language, "PostId", "TagId")=(en-us, 281, 10157) already exists. 

有人可以告訴我如何可能我收到這種違規行爲,而我實際上沒有改變任何東西嗎?

+0

那是什麼位「#tgs ......」在幹什麼? 'SET'TagId「=」TagId「#tgs。」mainId「' – 2014-09-20 16:03:32

+0

您正在使用子查詢中的值更新'TagId'。所以這肯定會造成重複。 – Wolph 2014-09-20 18:22:40

+0

'#tgs。「mainId」'只是評論。我只是將TagId設置爲其以前的值,以便如何導致違規? – user606521 2014-09-20 22:25:55

回答

1

#不會引入評論。它是按位XOR運算符。 The manual

有關行的末尾爲此評論,請使用-- THIS Is a Comment

UPDATE "PostsTags" 
SET "TagId" = "PostsTags"."TagId" -- COMMENTED OUT: tgs."mainId" 
FROM (
    SELECT t1."TagId" AS "mainId", t1.text AS "mainText", t2."TagId" AS "malformedId", t2.text AS "malformedText" 
    FROM "TagTranslations" t1 
    INNER JOIN "TagTranslations" t2 ON t1.text = regexp_replace(t2.text, '^\s+','') AND t2.id != t1.id 
    WHERE regexp_replace(t1.text, '^\s+','') = t1.text AND t1."language" = 'en-us' 
) tgs 
WHERE "PostsTags"."TagId" = tgs."malformedId" AND "PostsTags"."language" = 'en-us' AND "PostsTags"."PostId" = 281 
-- RETURNING * 
    ; 

BTW:還有不保證更新是正確的;子查詢可能結果在多個匹配元組返回一個給定t2.TagId - >tgs."malformedId" - >"postTags"."TagId"