gpt4 book ai didi

mysql - 如何使用mysql或knex和express js插入不存在的记录,如果存在则忽略它

转载 作者:行者123 更新时间:2023-11-29 15:34:56 24 4
gpt4 key购买 nike

我想检查我的数据库,如果该值已存在,则不要添加相同的值,如果不存在,则添加此新值。

我的代码

router.post('/additem', function(req, res, next){
db('types').insert({type_name: req.body.getypename}).where('type_name', '!=', req.body.getypename).then(()=>{
res.redirect('/additem?success=1')
}).catch((err)=>{ res.redirect('/additem?'+err) })
})

最佳答案

欢迎来到 Stackoverflow!

使用 .count() 是在添加记录之前检查记录是否存在的一种方法。请参阅下面的函数 countTypeNameRec 作为示例。

下面的函数addTypeNameRec然后将计数和插入放在一起,首先检查记录的计数,如果为零,则添加记录。

参见the Knex .count() reference有关使用 .count() 的更多详细信息。 (对于大型未索引表,使用 select * where xxx limit 1 可能是更好的性能选择。)

第二种方法:我认为这是一条硬性规则,即“type”表记录不能具有重复的“type_name”字段值。如果是这种情况,那么通过数据库中的 SQL 表定义将该字段设为主键(或在表上为该字段创建唯一索引)也将防止用户创建重复记录。在这种情况下,.insert() 语句将在重复记录上引发错误。但是,如果您想向用户提供可理解的“值已存在”错误消息,则解释该错误有点困惑。 Here是关于这个问题的讨论。

如果您不关心向用户返回他们可能无法理解的丑陋的原始数据库错误,那么您可以以简单的方式使用第二种方法,只需调用 insertTypeNameRec 函数来自路由代码而不是 addTypeNameRec 函数(跳过计数检查)。

代码

// count the records
//
function countTypeNameRec(input_type_name) {
return db('types')
.count('*')
.where('type_name', input_type_name)
.then((data)=>{
return data[0].count
})
}

// insert a new record
//
function insertTypeNameRec(input_type_name) {
return db('types')
.insert({type_name: input_type_name})
}

// Combine the count & insert - the real goal
//
function addTypeNameRec(input_type_name) {

return countTypeNameRec(input_type_name)
.then((rec_count) => {
if (rec_count===0) {
insertTypeNameRec(input_type_name)
} else {
// we can return an already exists error from here
}
})
}

// Web routing code
//
router.post('/additem', function(req, res, next){

const input_type_name = req.body.getypename;
// we could validate our input here

// for simplistic second method - call insertTypeNameRec() here instead
return addTypeNameRec(input_type_name)
.then(()=>{
res.redirect('/additem?success=1')
})
.catch((err)=>{
res.redirect('/additem?'+err)
})
})

// disclaimer: this code has not been tested

免费赠品(即对您没有询问的事情的评论)...我倾向于尝试将我的能力分解为我能做到的最小的部分/功能。然后,对每个部件进行故障排除和测试就变得非常简单。我特别尝试将数据库层和通信层的代码分开。然后就可以轻松地 stub Web 请求,并将它们与其他服务器处理分开进行测试。

关于mysql - 如何使用mysql或knex和express js插入不存在的记录,如果存在则忽略它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58343783/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com