问题标签 [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 回答
815 浏览

sql - 使用 Postgres SQL,为单行模拟 UPSERT 的最快事务是什么?

这个问题是关于单行的,而不是一组。我只是好奇使用最新最好的 Pg (9.0) 版本更快,为什么:

基于 PKEY 上的 SELECT 的条件 UPDATE 或 INSERT

尝试插入,在失败时捕获异常并回退到更新

尝试更新,在失败时捕获异常并回退到 INSERT

我认为因为这取决于数据集,所以我们假设三种情况:

  • 50% 的行存在,50% 不存在
  • 存在 100% 的行
  • 100% 的行不存在

存在意味着满足 PKEYs 并且应该更新行。任何有关这方面研究的链接都会很棒。

0 投票
3 回答
10480 浏览

mongodb - mongoDB mongoimport upsert

我正在尝试使用以下内容进行批量更新

我试图导入的 csv 看起来像这样。

它应该检查电子邮件列作为查询参数并相应地更新全名。但是,没有导入任何内容,它遇到了错误。

问题出在哪里?我应该怎么做?

0 投票
9 回答
22196 浏览

java - 使用 Hibernate 基于唯一键查找或插入

我正在尝试编写一种方法,该方法将基于唯一但非主键返回 Hibernate 对象。如果实体已经存在于数据库中,我想返回它,但如果它不存在,我想创建一个新实例并在返回之前保存它。

更新:让我澄清一下,我正在为其编写的应用程序基本上是输入文件的批处理器。系统需要逐行读取文件并将记录插入到数据库中。文件格式基本上是我们模式中几个表的非规范化视图,所以我要做的是解析父记录,或者将其插入数据库,以便我可以获得一个新的合成键,或者如果它已经存在,则选择它。然后,我可以在具有外键的其他表中添加额外的关联记录回到该记录。

这变得棘手的原因是每个文件都需要完全导入或根本不导入,即对给定文件所做的所有插入和更新都应该是一个事务的一部分。如果只有一个进程在执行所有导入,这很容易,但如果可能的话,我想将其拆分到多台服务器上。由于这些限制,我需要能够留在一个事务中,但要处理已经存在记录的异常。

父记录的映射类如下所示:

我最初编写此方法的尝试如下:

问题是当我要查找的名称存在时,调用 uniqueResult() 会引发 org.hibernate.AssertionFailure 异常。完整的堆栈跟踪如下:

有谁知道是什么导致这个异常被抛出?hibernate 是否支持更好的方法来实现这一点?

让我也先发制人地解释为什么我要先插入,然后再选择是否以及何时失败。这需要在分布式环境中工作,因此我无法在检查中同步以查看记录是否已经存在和插入。最简单的方法是让数据库通过检查每次插入时的约束冲突来处理这种同步。

0 投票
3 回答
7284 浏览

ruby - 使用 MongoDb 插入多条记录

我试图让 MongoDB 使用以下查询 upsert 多个记录,最终使用 MongoMapper 和 Mongo ruby​​ 驱动程序。

如果所有记录都存在,这可以正常工作,但不会为不存在的记录创建新记录。以下命令在 shell 中具有预期的效果,但对于 ruby​​ 驱动程序可能并不理想。

我可以循环遍历我想从 ruby​​ 中插入的每个 id,但这需要为每个项目访问数据库。有没有办法从 ruby​​ 驱动程序中插入多个项目,只需一次访问数据库?这里的最佳做法是什么?使用 mongomapper 和 ruby​​ 驱动程序,有没有办法在一个批次中发送多个更新,生成如下内容?

样本数据:

如果存在两条记录,则命令后的所需数据。

如果存在两条记录,则为命令后的实际数据。

如果仅存在 event_id 1 的记录,则命令后的所需数据。

如果仅存在 event_id 为 1 的记录,则为命令后的实际数据。

0 投票
2 回答
5705 浏览

sql - 使用 Oracle 和 PL/SQL 插入或更新

我有一个 PL/SQL 函数,它在 Oracle 数据库上执行更新/插入,该数据库维护一个目标总数并返回现有值和新值之间的差异。
这是我到目前为止的代码:

这在多个线程永不失败的单元测试中按预期工作。
但是,当加载到实时系统上时,我们看到此失败,堆栈跟踪如下所示:

行号(我已将其删除,因为它们在上下文中毫无意义)验证第一次更新由于没有数据而失败,插入由于唯一性而失败,第二次更新由于没有数据而失败,这应该是不可能的。

从我在其他线程上读到的内容来看,MERGE 语句也不是原子的,可能会遇到类似的问题。

有谁知道如何防止这种情况发生?

0 投票
6 回答
32593 浏览

python - pymongo 中的快速或批量更新

如何在 pymongo 中进行批量更新?我想更新一堆条目,一次做一个非常慢。

几乎相同的问题的答案在这里:在 MongoDB 中批量更新/更新?

接受的答案实际上并没有回答问题。它只是提供了一个到 mongo CLI 的链接以进行导入/导出。

我也愿意向某人解释为什么不可能进行批量 upsert/不是最佳实践,但请解释此类问题的首选解决方案是什么。

0 投票
1 回答
351 浏览

sql - 当 FK 引用行时执行 UPSERT

假设我有一个项目表,对于每个项目,可以为其存储额外的信息,这些信息会进入第二个表。附加信息由第一个表中的 FK 引用,可以为 NULL(如果项目没有附加信息)。

更新项目的附加信息(最好是在 IBM DB2 SQL 中)的“最佳实践”是什么?

它应该是一个 UPSERT 操作,这意味着如果附加信息尚不存在,则在第二个表中创建一条新记录,但如果存在,则仅更新它,并且第一个表中的 FK 不会更改。

因此,势在必行,这是逻辑:

我的主要问题是如何获取新插入的 addtl_info 行的 id(上面加下划线)。在存储过程中,我可以从序列中请求 id 并将其存储在变量中,但也许有更直接的方法。在编写数据库时,这不是一直出现的东西吗?

我的意思是,只要 addtl_info 记录的 id 保持唯一并且被正确引用,我真的不感兴趣。所以在这种情况下,使用序列对我来说似乎有点矫枉过正。

事实上,这个 UPSERT 操作应该是 SQL 语言的一部分作为标准操作(也许是,我只是不知道?)...

0 投票
1 回答
1197 浏览

php - 如果存在则更新记录,否则写入新记录?

我正在尝试执行此查询,当它找到 $serial 的记录时,它可以更新它。或者,如果序列号不存在,它可以写一条新记录。

我得到语法错误,但对我来说似乎很好。非常确定 ON DUPLICATE KEY UPDATE 是要走的路,但我错过了一些东西......

0 投票
4 回答
9272 浏览

mysql - Drupal 数据库 API 查询 - row.update 如果存在,否则 row.insert

我一直在尝试在drupal中运行一个查询,如果它们已经存在则更新条目,如果不存在则插入一个新条目。代码现在看起来像这样:

我不明白为什么该查询会引发错误。错误中的所有数字都是正确的

这个查询是否应该工作和/或在drupal中是否有更好的方法来处理这个问题?

0 投票
2 回答
5543 浏览

sql - 使用“ON CONFLICT”子句语义插入行的 postgresql 方法

postgres 中是否有一种简单的方法可以在 sqlite 中执行以下等效操作?

我环顾四周,发现的解决方案是复杂的自定义函数。我的问题的另一个解决方案是做

这在语义上并不等效,但适用于我的情况。

ON CONFLICT如果它不需要自定义功能,我会更喜欢该规则。