正如我已经发现的那样,可以通过执行类似的操作在一个查询中更新多行
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: db.none(update) .then(()=> { // success; }) .catch(error=> { // error; });
这种生成多行更新的方法可以表征为:
注意,我们?在列的前面使用id以指示该列是条件的一部分,但不进行更新。有关完整的列语法,请参见类Column和ColumnConfig结构。
?
id