我使用NodeJS和PG以及一个PostgreSQL数据库作为后端.我想在一个语句中向一个表插入多行,使用id(它是BIGSERIAL主键NOT NULL)来判断它是否是要插入而不是更新的新记录.

如果我创建查询,只需像这样传入值,它就可以工作:

let upsertQuery = `INSERT INTO triage (id, col1, col2)
    VALUES (1, 'abc', 'def'), (DEFAULT, 'ghi', 'jkl')
    ON CONFLICT (id) DO UPDATE SET
      col1 = EXCLUDED.col1,
      col2 = EXCLUDED.col2`;

但如果我使用参数来避免SQL注入,如下所示:

let upsertQuery = `INSERT INTO triage (id, col1, col2)
    VALUES ($1, $2, $3), ($4, $5, $6)
    ON CONFLICT (id) DO UPDATE SET
      col1 = EXCLUDED.col1,
      col2 = EXCLUDED.col2`;

let values = [1, 'abc', 'def', 'DEFAULT', 'ghi', 'jkl']

 try {
    await pool.query(upsertQuery, values)
    res.status(201).json({message:'Updated'});
 }
 catch(err) {
    await pool.query('ROLLBACK');
    console.log(JSON.stringify(err, null, 2));
 }

错误是:

"name":"错误", "Severity":"错误", "code":"22P02", "WHERE":"未命名门户参数$4=‘...’", "file":"numutils.c", "rouble":"pg_strtoint64"

推荐答案

我猜您正在传递字符串'DEFAULT'作为values数组中id字段的值. id字段的类型为BIGSERIAL,应为整数值,而不是字符串‘Default’.

如下所示修改代码,

let upsertQuery = `INSERT INTO triage (id, col1, col2)
    VALUES ($1, $2, $3), (DEFAULT, $4, $5)
    ON CONFLICT (id) DO UPDATE SET
      col1 = EXCLUDED.col1,
      col2 = EXCLUDED.col2`;

let values = [1, 'abc', 'def', 'ghi', 'jkl'];

try {
    await pool.query(upsertQuery, values);
    res.status(201).json({ message: 'Updated' });
} catch (err) {
    await pool.query('ROLLBACK');
    console.log(JSON.stringify(err, null, 2));
}

我希望它能奏效. 祝好运

#apache 时代#PostgreSQL#SQL

Javascript相关问答推荐

React状态变量在使用++前置更新时引发错误

Mongodb拥有5亿个文档,我想根据JavaScript驱动程序中的两个字段使用regEx进行搜索,而不是模式

Next.js Next/Image图像隐含性有任何类型-如何修复?

JS生成具有给定数字和幻灯片计数的数组子集

使用axios.获取实时服务器时的404响应

如何使覆盖div与可水平滚动的父div相关?

如何粗体匹配的字母时输入搜索框使用javascript?

如何添加绘图条形图图例单击角形事件

Javascript json定制

如何在ASP.NET中使用Google Charts API JavaScript将条形图标签显示为绝对值而不是负值

JS:XML insertBefore插入元素

面对代码中的错误作为前端与后端的集成

删除加载页面时不存在的元素(JavaScript)

如何在Java脚本中对列表中的特定元素进行排序?

在表单集中保存更改时删除';禁用';

当我点击一个按钮后按回车键时,如何阻止它再次被点击

使用RxJS from Event和@ViewChild vs KeyUp事件和RxJS主题更改输入字段值

使用Reaction窗体挂钩注册日历组件

使用CEPRESS截取时,cy.Wait()在等待5000ms的第一个路由请求时超时

在传单的图像覆盖中重新着色特定 colored颜色 的所有像素