关于sql:在node.js中Upsert – 什么是`IF EXIST`?

Upsert in node.js - what is `IF EXIST`?

本问题已经有最佳答案,请猛点这里访问。

有人能解释一下SQL中使用的if exist命令吗?

例如:

1
2
3
4
5
IF exist(SELECT * FROM waiter){
    UPDATE waiter SET (...) WHERE waiter_id='somevalue'
} ELSE{
    INSERT INTO waiter VALUES (VALUES)
}

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


我不知道这是否有帮助,但代码应该是:

1
2
3
4
5
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'记录,则更新该记录;否则,插入新记录。"


你采取的方法是错误的。它不起作用。停下来。

阅读有关Upserts的指南:

  • 在PostgreSQL中重复更新时插入?
  • 如何向上插入(合并、插入…在PostgreSQL中?

然后使用其中记录的正确方法之一,锁定表并执行upsert,或者在重试循环中执行。

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

  • 人员1:select * from waiter
  • 人员2:select * from waiter
  • 人1:if exist(...)=>假,不,不存在
  • 人2:if exist(...)=>假,不,不存在
  • 人员1:insert...
  • 人员2:insert...

Boom,你有两张唱片。

(这种方法也是非常低效的——select * from waiter非常可怕)。

这就是为什么每个人都会给你提供指向文章和文档的链接,这些文章和文档向你展示了如何正确地进行操作。你试图解决错误的问题。你实际上是在说"当我开车进入十字路口时,没有看到红绿灯,我怎么知道别人已经在那儿了?"我们是说"呃,别这样。看看红绿灯。"

只有当实际的upsert("create if not exists")操作正确后,才需要从node.js担心如何处理它。

无论如何,我会说它和任何其他查询一样:运行查询/命令,从查询中获取ID(现有的或新创建的),使用您想要的ID。如果您需要更多关于这一部分的帮助,请尝试在这一部分上发布node.js特定的问题,而不要把所有不正确的upsert代码搞得一团糟,从而使每个人都偏离轨道。考虑到PostgreSQL标签上的许多人对node.js的了解并不多。


exists语句对SQL进行部分扫描,以确定是否返回了某些内容。

如果我们检查了EDOCX1[2]的性能,如果与count()进行比较。我们将看到一个真正更快的SQL使用exists,因为count将检查数据库中的每一行。

希望它有帮助。