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...
^
我试过谷歌搜索无济于事。几个问题:
- 这里的具体错误是什么?(真的问为什么我会收到这个错误?)
- 在 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';