【问题标题】:Insert if not exist and update certain values if it does如果不存在则插入,如果存在则更新某些值
【发布时间】:2021-11-23 10:48:03
【问题描述】:

我正在使用 JDBI3(并且想使用 @SQLUpdate)和一个 Oracle 数据库。

我想在表中插入一个包含 4 列的项目,如果它不存在,如果它确实存在,我想更新项目的 4 个值中的 3 个。如果不是 Oracle,我会使用一些 ON DUPLICATE_KEY 逻辑,但这在 Oracle 中不存在。我读了一些关于使用 Merge 的东西,但是对于我想要做的事情来说,查询似乎真的很不稳定。关于寻找什么的任何提示?

附加问题:如果我应该使用 Merge(我假设使用某种形式的子查询),那么查询如何影响性能?我觉得这个数据库写得很重。

MERGE INTO device db USING (SELECT 'abc' AS col1, 'bcd' as col2, 'cde' as col3, 'def' as col4 FROM DUAL) input
on (db.col1 = input.col1 AND db.col2= input.col2)
WHEN MATCHED THEN UPDATE
SET db.col4 = input.col4
WHEN NOT MATCHED THEN INSERT
(db.col1, db.col2, db.col3, db.col4)
VALUES (input.col1, input.col2, input.col3, input.col4)

【问题讨论】:

  • 首先尝试保证成功的操作(即,如果该行通常存在则尝试更新,否则尝试插入)。如果语句失败(尝试插入后的任一 dup 键,否则没有更新行),捕获错误/警告并尝试另一个。 (数据库系统不会仅仅因为一条语句出错就中止事务)。

标签: java oracle jdbi jdbi3


【解决方案1】:

合并它。表现不错。

基于您的描述的虚拟示例:

merge into target_table a
  using source_table b
  on (a.id = b.id)
when matched then update set
  a.name = b.name,
  a.job  = b.job,
  a.sal  = b.sal
when not matched then 
  insert (id, name, job, sal) 
  values (b.id, b.name, b.job, b.sal);

【讨论】:

  • 那么关于那些目标/源表。你用比较查询创建了一个临时表?在这种情况下USING (SELECT FIELD FROM TABLE WHERE ID = inputID and OTHERFIELD != NULL) ?
  • 可以,可以是子查询,没问题。顺便说一句,当您将某些内容与 NULL 进行比较时,在 Oracle 中它是 otherfield IS NOT NULL,而不是 != null
  • 你得到哪个错误?
  • 我们修复了它是时区和人为错误。谢谢老兄。
  • 不客气;我很高兴你成功了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2016-05-15
  • 1970-01-01
  • 2016-11-27
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多