sql - 在检查是否需要保留旧值或插入新值时在 postgres SQL 上进行 Upsert 查询?
问题描述
我有一个 postgres SQL 查询,我想在其中进行 upsert。我的pk1, pk2
列是复合主键。dk1, dk2, timek
如果与主键约束冲突,我想更新 3 列。此外,当我更新冲突列时,比如timek
列,那么我需要检查新值是否小于旧值,并相应地选择是否需要使用旧值或新值。这是我的查询,但它会引发错误。我是 postgres SQL 的新手,请提出问题所在?
INSERT INTO data_reports (pk1, pk2, dk1, dk2, dk3, timek, valuek) VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (pk1, pk2) DO UPDATE SET
dk1 = EXCLUDED.dk1,
dk2 = CASE WHEN (dk2 < EXCLUDED.dk2) THEN EXCLUDED.dk2 ELSE dk2 END), // I believe dk2 (existing value in DB) is not selected but how to do that
timek = CASE WHEN (timek < EXCLUDED.timek) THEN EXCLUDED.timek ELSE timek END);
解决方案
- 您可以通过指定表名来引用更新前的列值:例如
data_reports.dk2
. - 打开和关闭括号,有 5
(
s 和 7)
s。 - 用 开始评论,或用和
--
括起来评论。/*
*/
INSERT INTO data_reports (pk1,pk2,dk1,dk2,dk3,timek,valuek)
VALUES (1,1,9,9,9,9,9)
ON CONFLICT (pk1,pk2) DO
UPDATE
SET
dk1 = EXCLUDED.dk1,
dk2 =
(CASE
WHEN (data_reports.dk2 < EXCLUDED.dk2) THEN EXCLUDED.dk2
ELSE data_reports.dk2
END),
timek =
(CASE
WHEN (data_reports.timek < EXCLUDED.timek) THEN EXCLUDED.timek
ELSE data_reports.timek
END);
推荐阅读
- python - Django:在DRF中序列化外部字段时返回值而不是键
- ios - 如何从方法中返回 Alamofire POST 请求的结果而不是 nil?
- gmail - 在 Java 中使用 Google 的 Directory API 检查电子邮件别名是否已经存在
- c - 为什么这个简单的 C 程序使用在 Ubuntu 和 Windows 中具有不同的 cpu 使用率?
- azure-pipelines - Azure Pipeline -- 对 Azure 进行一次身份验证,以执行所有后续步骤
- c# - onfocusout 防止下拉菜单项在 Blazor 中单击
- windows - GNU Emacs for Windows 仅忽略脚本的 PATH
- c - 在带有 GCC 的 Linux 上删除 C 库
- html - 使用css选择文件后如何更改表单中文件输入按钮的颜色?
- mitmproxy - 在 mitmproxy 中,我可以定义每个 URL 忽略的请求参数吗?