我有一张这样的桌子:
CREATE TABLE import_files (
id SERIAL PRIMARY KEY,
file TEXT NOT NULL,
volume TEXT NOT NULL,
lastimport DATE DEFAULT CURRENT_DATE,
UNIQUE (file,volume)
)
我正在尝试将数据导入表中,这样如果表中不存在file
和的组合,volume
则应添加新行,否则如果存在现有行,则应更新该行,以便
lastimport
为今天的日期.
但是,如果该行已经是今天的日期,我不想进行任何更新(同一行可能每天出现多次)。
我正在尝试为此使用 Postgresql 9.6 的新ON CONFLICT
子句,如下所示:
INSERT INTO import_files(file,volume)
VALUES('MyFile1', 'VolA')
ON CONFLICT (file,volume) DO
UPDATE SET lastimport = CURRENT_DATE
WHERE EXCLUDED.lastimport < CURRENT_DATE
RETURNING id
但它似乎对我不起作用。初始导入工作正常,但对于更新情况,即使 WHERE 子句为真,它似乎也不会更新:
t1=> select * from import_files;
id | file | volume | lastimport
----+---------+--------+------------
1 | MyFile1 | VolA | 2017-05-07
(1 row)
t1=> INSERT INTO import_files(file,volume)
VALUES('MyFile1', 'VolA')
ON CONFLICT (file,volume) DO
UPDATE SET lastimport = CURRENT_DATE
WHERE EXCLUDED.lastimport < CURRENT_DATE
RETURNING id
;
id
----
(0 rows)
INSERT 0 0
由于今天是 2017 年 5 月 8 日,我本以为该行会更新。
在这种情况下,我是否误解了 WHERE 子句的目的或用法?