【问题标题】:Upsert in node.js - what is `IF EXIST`? [duplicate]在 node.js 中插入 - 什么是`IF EXIST`? [复制]
【发布时间】:2014-02-10 04:07:54
【问题描述】:

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

例如:

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

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

【问题讨论】:

标签: sql postgresql


【解决方案1】:

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

阅读关于 upserts 的指南:

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

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

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

砰,你有两条记录

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

这就是为什么每个人都向您提供指向文章和文档的链接,向您展示如何正确操作。你试图解决错误的问题。您实际上是在说“当我开车进入十字路口时不看红绿灯,我怎么知道其他人是否已经在那里?”。我们在说“呃,不要那样做。看看红绿灯。”

只有当你正确完成了实际的 upsert(“如果不存在时创建”)操作,然后才担心如何从 node.js 处理它。

无论如何,我想说它就像任何其他查询一样:运行查询/命令,从查询中获取 id(现有的或新创建的),随意使用 ID。如果您需要有关该部分的更多帮助,请尝试仅在该部分上发布一个 node.js 特定问题,而不会出现所有不正确的 upsert 代码混乱以使每个人都偏离轨道。考虑到 标记上的许多人无论如何都不太了解 node.js。

【讨论】:

    【解决方案2】:

    exists 语句对 sql 进行部分扫描以了解是否返回了某些内容..

    如果我们检查 exists 的执行情况,如果与 count() 进行比较。我们会看到使用 exists 的 sql 非常快,因为 count 会检查数据库中的每一行。

    希望对你有帮助。

    【讨论】:

    • 现在我想在不查看数据库的情况下检查更新/插入是否已完成? @雨果·S·门德斯
    • 那么你需要将“where waiter_id='somevalue'”放入exists中,如下所示:exist(select * from waiter where waiter_id='somevalue')
    【解决方案3】:

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

    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' 记录,则更新记录;否则,插入新记录。”

    【讨论】:

    • 很好地找到了缺少的WHERE 子句。
    • @MichaelPerrenoud 。 . . “如果表不为空,则对可能存在或可能不存在的记录进行更新,否则插入记录”似乎不是明智或安全的事情。 ;)
    • @Gordon Linoff 现在如果我要看看这是否发生了呢?我怎么会知道?例如,如果不查看数据库,我如何知道更新或插入是否发生?
    • @user3192435 。 . .最简单的做法是在每个子句中设置一个变量,然后检查该变量。
    猜你喜欢
    • 1970-01-01
    • 2014-02-25
    • 2016-11-02
    • 1970-01-01
    • 2017-04-27
    • 2019-08-21
    • 2012-01-03
    • 1970-01-01
    • 2015-06-20
    相关资源
    最近更新 更多