有人可以解释SQL中使用的if exist命令吗?
例如:
if exist(select * from waiter){
update waiter set (...) where waiter_id='somevalue'
} else{
insert into waiter values (values)
}
您是否还可以解释如何在不进入数据库的情况下检查更新/插入是否已完成?
答案 0 :(得分:2)
我不知道这是否有帮助,但代码可能应该是:
if exist(select * from waiter where waiter_id='somevalue') {
update waiter set (...) where waiter_id='somevalue'
} else{
insert into waiter values (values)
}
在这种情况下if exists . . .
部分说“如果表中存在记录”。总的来说,该声明说“如果值中存在'somevalue'
记录,则更新记录;否则,插入新记录。”
答案 1 :(得分:0)
exists
语句对sql进行部分扫描,以确定是否返回了某些内容。
如果我们检查一下exists
的表现是否与count()相符..我们会看到一个非常快的sql使用exists,因为count会检查数据库的每一行。
希望它有所帮助。
答案 2 :(得分:0)
你采取的方法是错误的。不起作用。停止。
阅读有关upserts的指南:
然后使用其中记录的正确的方法之一,锁定表并执行upsert,或者在重试循环中执行。
要了解当前方法出错的原因,请考虑当两个人同时执行相同命令时会发生什么。
select * from waiter
select * from waiter
if exist(...)
=>假,不,不存在if exist(...)
=>假,不,不存在insert...
insert...
和繁荣,你有两个记录。
(这种方法也非常低效 - SELECT * FROM WAITER
太可怕了。)
这就是为什么每个人都会给你链接到文章和文档,告诉你如何正确地做到这一点。你正试图解决错误的问题。你有效地说:“当我开车进入交叉路口而不看交通信号灯时,我怎么知道其他人是否已经在那里?”。我们说“呃,不要那样做。看看红绿灯。”
只有实际的upsert(“create if not exists”)操作正确后,然后才会担心如何从node.js处理它。
我会说它会像任何其他查询一样:运行查询/命令,获取id(现有的或新创建的)作为查询的结果,然后根据需要使用ID。如果您需要有关该部分的更多帮助,请尝试在该部分上发布node.js特定问题,而不是所有错误的upsert-code混乱都会让所有人偏离轨道。考虑到postgresql标签上的许多人无论如何都不会对node.js了解多少。