【发布时间】:2017-12-28 11:05:24
【问题描述】:
我正在使用 pg-promise 来处理我的 Postgres 查询,但我无法找到以下查询的解决方案:
我正在尝试创建一种方法来一次批量更新多行, 这是我的代码:
massUpsert: (orgId, entities) => db.tx((t) => {
const queries = [];
entities.forEach((entity) => {
const { id, name, age, type } = entity;
queries.push(
t.one(`INSERT INTO public.table (id, name, age, type)
VALUES ($1, $2, $3, $4)
ON CONFLICT (id) DO update
SET
name = $2,
age = $3,
type = $4
RETURNING *`,
[id, name, age, type]));
});
return t.batch(queries);
}),
现在的问题是,在某些情况下,我的一个或多个字段为 null,我希望数据库保留旧值而不是用 null 替换它。
有什么建议吗?
【问题讨论】:
-
您是否考虑过在数据库本身上使用触发器?
-
你不应该在
ON CONFLICT中使用name = $2之类的东西,它应该是name = excluded.name,你可以通过检查null的函数来进一步改进。 -
@vitaly-t 我没完全理解你,你用excluded.name是什么意思?
-
这是标准解决方案,
excluded是保留名称,指的是冲突列。检查 PostgreSQL 文档。 -
@vitaly-t,据我所知,排除并不能满足我对冲突列的需求,而不是更新其他列,我唯一想要的防止是在更新时忽略更新具有空值的列。
标签: javascript node.js pg-promise