gpt4 book ai didi

Postgresql INSERT ... ON CONFLICT ... WHERE 不触发

转载 作者:行者123 更新时间:2023-11-29 14:09:44 34 4
gpt4 key购买 nike

我有一个这样的表:

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 子句的用途或用法?

最佳答案

解决方案非常简单...

EXCLUDED 表包含最初建议插入的行,而不是正在更新的当前行。我没有为 lastimport 指定值,所以它会填充默认值 - 在本例中为 CURRENT_DATE,因此 where 子句永远不会为真。

相反,我应该使用这个:

t1=> INSERT INTO import_files(file,volume)
VALUES('MyFile1', 'VolA')
ON CONFLICT (file,volume) DO
UPDATE SET lastimport = CURRENT_DATE
WHERE import_files.lastimport < CURRENT_DATE
RETURNING id
;
id
----
1
(1 row)

INSERT 0 1

where 子句应该使用 import_files.lastimport 引用当前行值,而不是使用 EXCLUDED.lastimport 引用建议值。

关于Postgresql INSERT ... ON CONFLICT ... WHERE 不触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43840187/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com