【问题标题】:INSERT INTO only if Name and Location DON'T match仅当名称和位置不匹配时才插入
【发布时间】:2021-04-14 15:51:37
【问题描述】:

我试图只在我的 psql 表中添加一条记录,如果它具有唯一的名称和位置。如果表中不存在条目(名称或位置),它可以插入记录,但如果名称已经存在,我的服务器会抛出错误以响应查询。到目前为止,这是我的代码:

app.post("/addCampground", async (req, res) => {
    const name = req.body.name;

    const location = req.body.location;
    const leng = req.body.maxlength;
    const elev = req.body.elevation;
    const site = req.body.sites;
    const pad = req.body.pad;

try{
    
const template = "INSERT INTO campgrounds (name, location, maxlength, elevation,
 sites, padtype) VALUES ($1, $2, $3, $4, $5, $6) SELECT name, location WHERE NOT 
EXISTS(SELECT name, location from campgrounds where name =$1 AND location =$2) ";
console.log(template);
const response = await pool.query(template, [name, location, leng, elev, site,
 pad], [name, location]);

res.json({status: "added", results:{name:name, location:location} });
}catch (err){
    res.json({status: "campground already in database"});
}

})

有问题的查询是:

const template = "INSERT INTO campgrounds (name, location, maxlength, elevation, sites, padtype) VALUES
 ($1, $2, $3, $4, $5, $6) SELECT name, location WHERE NOT EXISTS(SELECT name, location from campgrounds
 where name =$1 AND location =$2) ";

const response = await pool.query(template, [name, location, leng, elev, site, pad], [name, location]);

尝试添加名称匹配但位置不同的记录时出错:

TypeError: cb is not a function
    at Query.callback (/home/sbeg/db-class-350/practice/task4/node_modules/pg-pool/index.js:376:18)
    at Query.handleError (/home/sbeg/db-class-350/practice/task4/node_modules/pg/lib/query.js:128:19)
    at Client._handleErrorMessage (/home/sbeg/db-class-350/practice/task4/node_modules/pg/lib/client.js:335:17)
    at Connection.emit (events.js:315:20)
    at /home/sbeg/db-class-350/practice/task4/node_modules/pg/lib/connection.js:115:12
    at Parser.parse (/home/sbeg/db-class-350/practice/task4/node_modules/pg-protocol/dist/parser.js:40:17)
    at Socket.<anonymous> (/home/sbeg/db-class-350/practice/task4/node_modules/pg-protocol/dist/index.js:10:42)
    at Socket.emit (events.js:315:20)
    at addChunk (_stream_readable.js:295:12)
    at readableAddChunk (_stream_readable.js:271:9)

【问题讨论】:

  • 您不能在插入语句中同时使用 VALUES 和 SELECT。看来您应该使用 INSERT... ON CONFLICT。
  • 会不会像“在冲突中唯一不做任何事情的情况下插入露营地(名称、位置、最大长度、海拔、地点、垫型)值(1 美元、2 美元、3 美元、4 美元、5 美元、6 美元)” ?如果我将其更改为此,则不会插入任何内容

标签: javascript sql postgresql postman psql


【解决方案1】:

正确的 sql 语法:

INSERT INTO campgrounds (name, location, maxlength, elevation, sites, padtype) 
SELECT ($1, $2, $3, $4, $5, $6)
WHERE NOT EXISTS(SELECT 1 from campgrounds where name =$1 AND location =$2)

或者,如果您对名称、位置列有唯一索引,则可以使用on confflict

INSERT INTO campgrounds (name, location, maxlength, elevation, sites, padtype) 
VALUES ($1, $2, $3, $4, $5, $6) ON CONFLICT unique_index DO NOTHING

【讨论】:

    猜你喜欢
    • 2013-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2017-04-21
    • 2016-05-07
    • 2013-04-28
    相关资源
    最近更新 更多