Postgresql

Postgres 10.0 upsert 語法錯誤不知道用Google搜尋什麼

  • March 4, 2019

Postgres 10.0

桌子:

pcr=> \d tableFindOld
                              Table "public.tablefindold"
 Column  |            Type             | Collation | Nullable |         Default
----------+-----------------------------+-----------+----------+-------------------------
hostname | character varying(16)       |           | not null |
lastmiss | timestamp without time zone |           |          |
lastfind | timestamp without time zone |           |          |
uname    | character varying(64)       |           |          | NULL::character varying
Indexes:
   "tablefindold_pkey" PRIMARY KEY, btree (hostname)

更新聲明:

INSERT INTO tableFindOld(hostname, lastMiss, lastFind, uname) 
VALUES('pcname', DEFAULT, '2019-03-04 11:38:04', 'billy') 
ON CONFLICT (tableFindOld.hostname) 
   DO UPDATE SET lastFind='2019-03-04 11:38:04', uname='billy' 
   WHERE tableFindOld.hostname='pcname';

錯誤:

ERROR:  syntax error at or near ")"
LINE 1: ...8:04', 'billy') ON CONFLICT (tableFindOld.hostname) DO UPDAT...
                                                            ^

我試過Google搜尋無濟於事。幾個問題:

  • 這裡的具體錯誤是什麼?(真的問我為什麼會收到這個錯誤?)
  • 在 upsert 語句中,對於列衝突條件(在本例中是主鍵衝突),列名是否應該括在括號中?我看到了一些不一致的資訊。
  • 在帶有更新的 upsert 語句中,我們是否應該包含DO關鍵字?也看到了不一致的資訊。

此外,我在DEFAULT NULL除主鍵之外的所有列上創建了表,所以我不確定為什麼描述中沒有反映出來。

在此先感謝您的幫助。

編輯:這是我的表創建程式碼:

CREATE TABLE tableFindOld(
   hostname VARCHAR(16) PRIMARY KEY,
   lastMiss TIMESTAMP DEFAULT NULL,
   lastFind TIMESTAMP DEFAULT NULL,
   uname VARCHAR(64) DEFAULT NULL
);

解決方案:感謝 McNets 的回答。供參考,工作說明:

INSERT INTO tableFindOld(hostname, lastMiss, lastFind, uname) VALUES('pcname', DEFAULT, '2019-03-04 12:30:04', 'billy') ON CONFLICT (hostname) DO UPDATE SET lastFind='2019-03-04 12:30:04', uname='billy' WHERE tableFindOld.hostname='pcname';

刪除表名:

ON CONFLICT (hostname)

db<>在這裡擺弄

引用自文件:

衝突條款

[ ON CONFLICT [ conflict_target ] conflict_action ]

conflict_target 可以執行唯一索引推斷。執行推理時,它包含一個或多個index_column_name列和/或index_expression表達式,以及一個可選的index_predicate。所有table_name唯一索引,不考慮順序,完全包含衝突目標指定的列/表達式,都被推斷(選擇)為仲裁索引。

引用自:https://dba.stackexchange.com/questions/231255