Postgresql
Postgres 10.0 upsert 語法錯誤不知道用Google搜尋什麼
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唯一索引,不考慮順序,完全包含衝突目標指定的列/表達式,都被推斷(選擇)為仲裁索引。