0
我有一個更新插入語句(http://www.the-art-of-web.com/sql/upsert/)執行INSERT每當有ID的行不存在,當行存在更新列:UPSERT和子選擇
WITH upsert AS
(UPDATE foo SET counter=counter+1 WHERE id='bar' RETURNING *)
INSERT INTO foo(id, counter) SELECT 'bar', 0
WHERE NOT EXISTS (SELECT * FROM upsert) RETURNING counter;
id是主鍵列(如預期)。直到這裏一切正常。
但有第三列'位置'可用於自定義排序。 如果有更新,我想保留當前值。
但insert語句需要額外的子查詢中使用不返回可能的最低位置:使用此聲明我得到一個錯誤
ERROR: duplicate key value violates unique constraint "id"
什麼錯在這裏
WITH upsert AS
(UPDATE foo SET counter=counter+1 WHERE id='bar' RETURNING *)
INSERT INTO foo(id, counter, position) SELECT 'bar', 0, MIN(position)-1 from foo
WHERE NOT EXISTS (SELECT * FROM upsert) RETURNING counter;
?
?你可以粘貼\ d foo –
的輸出在附註中,你的upsert是錯誤的,並且不會做你認爲它的工作,除非你在運行它之前先鎖定TABLE foo IN EXCLUSIVE MODE。請參閱http://stackoverflow.com/q/17267417/398670及其鏈接。如果'id'有一個'unique'約束或'primary key',它不會插入重複項,但是當你一次從多個連接運行它時,由於競爭條件,它仍然會失敗,並出現重複鍵錯誤。 –
@KouberSaparev:id被定義爲約束不爲null的整數默認nextval('foo_id_seq':: regclass) – lgersman