我正尝试使用pg-promise将多行数据插入到pgsql数据库中。在我的情况下,我尝试插入的几条记录可能已经存在于表中。在这种情况下,我需要更新它们。通过查阅pg-promise官方文档,我发现可以使用helpers插入或更新多行数据。是否有办法像下面这样进行多个插入/更新?
INSERT INTO table_name(column_list)
VALUES(value_list)
ON CONFLICT target action;
我正尝试使用pg-promise将多行数据插入到pgsql数据库中。在我的情况下,我尝试插入的几条记录可能已经存在于表中。在这种情况下,我需要更新它们。通过查阅pg-promise官方文档,我发现可以使用helpers插入或更新多行数据。是否有办法像下面这样进行多个插入/更新?
INSERT INTO table_name(column_list)
VALUES(value_list)
ON CONFLICT target action;
const cs = new pgp.helpers.ColumnSet(['first', 'second', 'third', 'fourth'],
{table: 'my-table'});
// let's assume columns 'first' and 'second' produce conflict when exist:
const onConflict = ' ON CONFLICT(first, second) DO UPDATE SET ' +
cs.assignColumns({from: 'EXCLUDED', skip: ['first', 'second']});
在下面的示例中,我们假设您的data
是有效对象的数组:
const upsert = pgp.helpers.insert(data, cs) + onConflict; // generates upsert
await db.none(upsert); // executes the query:
如果您希望所有生成的 SQL 语句均为大写而不是小写,则可以设置选项 capSQL
:
const pgp = require('pg-promise')({
capSQL: true
});
最好的方法是借助pg-monitor来查看生成和执行的内容。
assignColumns
只是为了简化常规赋值,因为它涵盖了99%的实际情况。而您所要求的是相当独特的。 - vitaly-tdb.result()
我们可以得到 rowCount
,但是没有指定哪些列会发生冲突。 - user3770935
ON CONFLICT …
作为字符串附加即可。 - BergiassignColumns
! - Bergi