在检查是否需要保留旧值或插入新值时,在 postgres SQL 上插入查询?
Upsert query on postgres SQL while checking if need to keep old values or insert new values?
我有一个 postgres SQL 查询,我想在其中进行更新插入。
我的 pk1, pk2
列是复合主键。如果与主键约束冲突,我想更新 3 列 dk1, dk2, timek
。
此外,当我更新冲突列时,比如 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);
- 您可以通过指定 table 名称来引用更新前的列值:例如
data_reports.dk2
。
- 左右括号,有5个
(
和7个)
。
- 以
--
开始评论,或以 /*
和 */
结束评论。
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);
仅供参考:您可以通过用 LEAST 函数替换 CASE 表达式来简化:
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 = least(data_reports.dk2, excluded.dk2),
timek = least(data_reports.timek, excluded.timek);
我有一个 postgres SQL 查询,我想在其中进行更新插入。
我的 pk1, pk2
列是复合主键。如果与主键约束冲突,我想更新 3 列 dk1, dk2, timek
。
此外,当我更新冲突列时,比如 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);
- 您可以通过指定 table 名称来引用更新前的列值:例如
data_reports.dk2
。 - 左右括号,有5个
(
和7个)
。 - 以
--
开始评论,或以/*
和*/
结束评论。
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);
仅供参考:您可以通过用 LEAST 函数替换 CASE 表达式来简化:
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 = least(data_reports.dk2, excluded.dk2),
timek = least(data_reports.timek, excluded.timek);