在node.js中upsert - 什么是`IF EXIST`?

时间:2014-01-20 20:15:32

标签: sql postgresql

有人可以解释SQL中使用的if exist命令吗?

例如:

if exist(select * from waiter){
    update waiter set (...) where waiter_id='somevalue'
} else{
    insert into waiter values (values)
}

您是否还可以解释如何在不进入数据库的情况下检查更新/插入是否已完成?

3 个答案:

答案 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,或者在重试循环中执行。

要了解当前方法出错的原因,请考虑当两个人同时执行相同命令时会发生什么。

  • person1:select * from waiter
  • person2:select * from waiter
  • person1:if exist(...) =>假,不,不存在
  • person2:if exist(...) =>假,不,不存在
  • person1:insert...
  • person2:insert...

繁荣,你有两个记录

(这种方法也非常低效 - SELECT * FROM WAITER太可怕了。)

这就是为什么每个人都会给你链接到文章和文档,告诉你如何正确地做到这一点。你正试图解决错误的问题。你有效地说:“当我开车进入交叉路口而不看交通信号灯时,我怎么知道其他人是否已经在那里?”。我们说“呃,不要那样做。看看红绿灯。”

只有实际的upsert(“create if not exists”)操作正确后,然后才会担心如何从node.js处理它。

我会说它会像任何其他查询一样:运行查询/命令,获取id(现有的或新创建的)作为查询的结果,然后根据需要使用ID。如果您需要有关该部分的更多帮助,请尝试在该部分上发布node.js特定问题,而不是所有错误的upsert-code混乱都会让所有人偏离轨道。考虑到标签上的许多人无论如何都不会对node.js了解多少。