仅当名称和位置不匹配时才插入
INSERT INTO only if Name and Location DON'T match
我试图只在我的 psql table 中添加一条记录,如果它具有唯一的名称和位置。如果条目在 table(名称或位置)中不存在,它可以插入一条记录,但如果名称已经存在,我的服务器会抛出一个错误来响应查询。到目前为止,这是我的代码:
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 (, , , , , ) SELECT name, location WHERE NOT
EXISTS(SELECT name, location from campgrounds where name = AND location =) ";
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
(, , , , , ) SELECT name, location WHERE NOT EXISTS(SELECT name, location from campgrounds
where name = AND location =) ";
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)
sql 的正确语法:
INSERT INTO campgrounds (name, location, maxlength, elevation, sites, padtype)
SELECT (, , , , , )
WHERE NOT EXISTS(SELECT 1 from campgrounds where name = AND location =)
或者如果您在名称、位置列上有唯一索引,您可以使用 on confflict
:
INSERT INTO campgrounds (name, location, maxlength, elevation, sites, padtype)
VALUES (, , , , , ) ON CONFLICT unique_index DO NOTHING
我试图只在我的 psql table 中添加一条记录,如果它具有唯一的名称和位置。如果条目在 table(名称或位置)中不存在,它可以插入一条记录,但如果名称已经存在,我的服务器会抛出一个错误来响应查询。到目前为止,这是我的代码:
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 (, , , , , ) SELECT name, location WHERE NOT
EXISTS(SELECT name, location from campgrounds where name = AND location =) ";
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
(, , , , , ) SELECT name, location WHERE NOT EXISTS(SELECT name, location from campgrounds
where name = AND location =) ";
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)
sql 的正确语法:
INSERT INTO campgrounds (name, location, maxlength, elevation, sites, padtype)
SELECT (, , , , , )
WHERE NOT EXISTS(SELECT 1 from campgrounds where name = AND location =)
或者如果您在名称、位置列上有唯一索引,您可以使用 on confflict
:
INSERT INTO campgrounds (name, location, maxlength, elevation, sites, padtype)
VALUES (, , , , , ) ON CONFLICT unique_index DO NOTHING