问题标签 [upsert]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
1466 浏览

mysql - 如何用一条 SQL 语句 upsert 两个数据库表?

下面描述了两个数据库表。星号突出显示主键。

我想根据表url_references中相应条目的存在插入更新帖子。达到此目的的最佳SQL 命令组合是什么?我想避免PHP中处理关于插入更新的决定。 以下场景描述了使用 PHP 命令的替代分步行为。

场景 1:插入新条目。

场景 2:更新现有条目。


编辑 1:请注意,我无法直接检查帖子中的id!我想根据他们的url作为主键来管理(插入/更新)帖子。

0 投票
8 回答
80246 浏览

python - 如何使用 SqlAlchemy 进行 upsert?

我有一条记录,如果它不存在,我想存在于数据库中,如果它已经存在(主键存在),我希望将字段更新到当前状态。这通常称为upsert

以下不完整的代码片段演示了什么会起作用,但它似乎过于笨拙(特别是如果有更多的列)。什么是更好/最好的方法?

有没有更好或更简洁的方法来做到这一点?这样的事情会很棒:

虽然unique_keykwarg 显然是不必要的(ORM 应该能够很容易地解决这个问题)我添加它只是因为 SQLAlchemy 倾向于只使用主键。例如:我一直在研究Session.merge是否适用,但这仅适用于主键,在这种情况下,主键是一个自动递增的 id,对此目的并不是非常有用。

一个示例用例是在启动可能已升级其默认预期数据的服务器应用程序时。即:这个upsert没有并发问题。

0 投票
2 回答
3016 浏览

sql - 如何在 T-SQL 中编写简单的插入或更新?

我有一个不想跟踪的过程是创建还是更新。跟踪会很复杂。我想执行创建或更新。架构就像...

我正在考虑做

你有什么建议?


我想确保我理解另一个投票最多的答案。给定我的模式,更新总是发生(即使有插入),但插入只发生在它不存在的地方?

0 投票
3 回答
948 浏览

php - mysql_affected_rows(); 不适用于检查行是否存在

我正在使用 mysql_affected_rows() 来检查我是否必须输入新记录或更新现有记录,但问题是用户是否尝试输入与它运行插入的已存在记录完全相同的数据。

我应该怎么做才能避免多余的条目

0 投票
1 回答
9467 浏览

sql - Postgresql upsert 查询

可能重复:
插入,重复更新(postgresql)
无法从 postgres 中的 UPDATE RETURNING 子句中选择

帮助理解我的语法错误。我尝试在 PosgreSql 中实现 upsert 查询:

错误是:

但是没有插入部分的更新子查询效果很好。

有没有最简单的方法来进行更新插入查询?

0 投票
5 回答
8426 浏览

database - Postgresql - 如果记录不存在则插入记录的干净方法,如果存在则更新

这是我的情况。我有一张包含一堆 URL 和与之关联的抓取日期的表格。当我的程序处理一个 URL 时,我想插入一个带有抓取日期的新行。如果 URL 已经存在,我想将抓取日期更新为当前日期时间。对于 MS SQL 或 Oracle,我可能会为此使用 MERGE 命令。对于 mySQL,我可能会使用 ON DUPLICATE KEY UPDATE 语法。

我可以在我的程序中执行多个查询,这可能是线程安全的,也可能不是线程安全的。我可以编写一个具有各种 IF...ELSE 逻辑的 SQL 函数。但是,为了尝试我以前从未使用过的 Postgres 功能,我正在考虑创建一个 INSERT 规则 - 如下所示:

这似乎真的很好用。它可能在“代码可读性”的角度上失去了一些观点,因为第一次看我的代码的人必须神奇地知道这个规则,但我想这可以通过良好的代码注释和文档来解决。

这个想法是否还有其他缺点,或者可能是“你的想法很糟糕,你应该这样做 /this/ 方式”评论?如果这很重要,我在 PG 9.0 上。

更新:查询计划,因为有人想要它:)

0 投票
1 回答
7890 浏览

python - 如何使用python在postgres中获取插入或选择的行ID

我的 postgres 查询是:

如果新插入的状态值 id 不存在,我需要获取它,或者如果已经存在,则选择它的 id。RETURNING id完全阻塞了这个查询,所以我不得不删除它以至少让选择性插入工作。

有什么线索可以在这里获取 statusId 吗?在另一个例子中,我正在执行 Upsert。(如果不存在则插入,否则更新)这里我需要插入或更新的行 ID。(不,我没有使用存储过程,如果这是你的第一个问题......)

提前致谢

0 投票
1 回答
611 浏览

mongodb - mongoimport - $addToSet/$push 与 upsert?

是否可以编写 JSONmongoimport以在upsert期间附加到现有数组?(mongodb 2.0)

0 投票
2 回答
2273 浏览

sql-server - 复杂的 TSQL 合并

我已经“继承”了一段出色的 TSQL 代码,它可以做到这一点:

  • 在游标上逐行循环。
  • 游标包含表A中需要合并(Upserted)的数据
  • 对于游标中的每个行循环,都会调用一个存储过程。过程:
    • 如果表 A 中存在相应的行,则更新该行
    • 如果这样的行不存在,则:
      • 在不同的表 B 中插入单行。
      • 获取新生成的 ID(比如它称为 IDB)
      • 在表 A 中插入一行。表 A 插入需要一个 IDB(该字段不为空,它应该仅具有表 B 中的值,但没有 FK 约束)

显然这很糟糕(性能和优雅的原因)!

问题 起初,这看起来像是一个标准的 MERGE 用法。我试着做:

还尝试了各种方法,例如 anested select that sends IDB on the OUTPUT但它失败了,因为 IDB 是一个 PK。

其他类型的合并也失败了,例如:

有人对此有想法吗?从本质上讲,我认为如果我们概括问题将是:

Can I insert and return the PK in one statement that can be nested in other statements

提前感谢您的任何回复

乔治

0 投票
1 回答
1578 浏览

c# - MongoDb Upsert 死锁

是否有可能在 MongoDb upsert 操作上达到死锁?我正在对 upsert 操作执行负载测试,如下所示:

使用官方 mongodb C# 驱动程序部署在 Azure 机器上。单实例,还没有副本集或分片。

当我运行 5000 个相同的更新命令时,分成 200 个并发线程(2 台机器,每台 100 个线程),大多数情况下它会以死锁结束。即许多电话永远不会回来。我可以通过控制台从 db.currentOp() 中看到,许多更新仍然存在,卡在 lockType:'write' 的锁定:true 中。

为什么会发生这种僵局?这怎么可能?我该如何预防呢?是否有任何具体的指导方针应该避免哪些操作以避免 mongodb 死锁?

$atomic 与解决方案有关吗?我什至不知道如何在 c# 上设置 $atomic:true,尽管它可能与这个死锁问题无关。