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) } |
在本例中,
你采取的方法是错误的。它不起作用。停下来。
阅读有关Upserts的指南:
- 在PostgreSQL中重复更新时插入?
- 如何向上插入(合并、插入…在PostgreSQL中?
然后使用其中记录的正确方法之一,锁定表并执行upsert,或者在重试循环中执行。
要理解当前方法错误的原因,请考虑当两个人同时执行相同的命令时会发生什么。
- 人员1:
select * from waiter 。 - 人员2:
select * from waiter 。 - 人1:
if exist(...) =>假,不,不存在 - 人2:
if exist(...) =>假,不,不存在 - 人员1:
insert... 。 - 人员2:
insert... 。
Boom,你有两张唱片。
(这种方法也是非常低效的——
这就是为什么每个人都会给你提供指向文章和文档的链接,这些文章和文档向你展示了如何正确地进行操作。你试图解决错误的问题。你实际上是在说"当我开车进入十字路口时,没有看到红绿灯,我怎么知道别人已经在那儿了?"我们是说"呃,别这样。看看红绿灯。"
只有当实际的upsert("create if not exists")操作正确后,才需要从node.js担心如何处理它。
无论如何,我会说它和任何其他查询一样:运行查询/命令,从查询中获取ID(现有的或新创建的),使用您想要的ID。如果您需要更多关于这一部分的帮助,请尝试在这一部分上发布node.js特定的问题,而不要把所有不正确的upsert代码搞得一团糟,从而使每个人都偏离轨道。考虑到PostgreSQL标签上的许多人对node.js的了解并不多。
如果我们检查了EDOCX1[2]的性能,如果与count()进行比较。我们将看到一个真正更快的SQL使用exists,因为count将检查数据库中的每一行。
希望它有帮助。