因为我已经在这里找到了 On Stackoverflow可以通过做这样的事情在一个查询中更新多行
update test as t set
column_a = c.column_a,
column_c = c.column_c
from (values
('123', 1, '---'),
('345', 2, '+++')
) as c(column_b, column_a, column_c)
where c.column_b = t.column_b;
特别感谢@Roman Pekar 的明确回答。
现在我正在尝试将这种更新方式与查询 NodeJS 中的 postgreSQL 数据库合并。
这是我的代码片段:
var requestData = [
{id: 1, value: 1234}
{id: 2, value: 5678}
{id: 3, value: 91011}
]
client.connect(function (err) {
if (err) throw err;
client.query(buildStatement(requestData), function (err, result) {
if (err) throw err;
res.json(result.rows);
client.end(function (err) {
if (err) throw err;
});
});
});
var buildStatement = function(requestData) {
var params = [];
var chunks = [];
for(var i = 0; i < requestData.length; i++) {
var row = requestData[i];
var valuesClause = [];
params.push(row.id);
valuesClause.push('$' + params.length);
params.push(row.value);
valuesClause.push('$' + params.length);
chunks.push('(' + valuesClause.join(', ') + ')');
}
return {
text: 'UPDATE fit_ratios as f set ratio_budget = c.ratio_budget from (VALUES ' + chunks.join(', ') + ') as c(ratio_label, ratio_budget) WHERE c.ratio_label = f.ratio_label', values: params
}
}
我没有收到错误,但它没有更新我的表,我真的不知道这里出了什么问题。也许我的查询代码中存在语法错误?我只是没有在 NodeJS pg 包中找到更新时多行查询的任何具体示例
最佳答案
以下示例基于库 pg-promise , 及其方法 helpers.update :
// library initialization, usually placed in its own module:
const pgp = require('pg-promise')({
capSQL: true // capitalize all generated SQL
});
const db = pgp(/*your connection details*/);
// records to be updated:
const updateData = [
{id: 1, value: 1234},
{id: 2, value: 5678},
{id: 3, value: 91011}
];
// declare your ColumnSet once, and then reuse it:
const cs = new pgp.helpers.ColumnSet(['?id', 'value'], {table: 'fit_ratios'});
// generating the update query where it is needed:
const update = pgp.helpers.update(updateData, cs) + ' WHERE v.id = t.id';
//=> UPDATE "fit_ratios" AS t SET "value"=v."value"
// FROM (VALUES(1,1234),(2,5678),(3,91011))
// AS v("id","value") WHERE v.id = t.id
// executing the query:
await db.none(update);
这种生成多行更新的方法可以描述为:
- 非常快,因为它依赖于类型 ColumnSet为查询生成实现智能缓存
- 完全安全,因为所有数据类型都经过图书馆的查询格式化引擎,以确保所有内容都被正确格式化和转义。
- 非常灵活,由于先进ColumnConfig列定义支持的语法。
- 由于 pg-promise 实现的简化界面,非常易于使用.
请注意,我们在 id
列前面使用 ?
表示该列是条件的一部分,但不会更新。有关完整的列语法,请参阅类 Column和 ColumnConfig结构。
关于node.js - Node.js 中的 PostgreSQL 多行更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39119922/