更新记录(如果存在);否则在 Oracle 中插入

Posted

技术标签:

【中文标题】更新记录(如果存在);否则在 Oracle 中插入【英文标题】:UPDATE record if present; else INSERT in Oracle 【发布时间】:2011-01-21 23:38:37 【问题描述】:

是否有任何 Oracle 函数表明记录的存在,或任何其他有用的技术来实现这一点?

编辑:使用我所做的 MERGE 语句:

MERGE
 INTO  lims_min.mytab src
 USING lims_min.mytab tgt
    ON (    src.col1 = tgt.col1
        AND tgt.col1 = p_val1
        AND src.col2 = tgt.col2
        AND tgt.col2 = p_val2
       )

 WHEN MATCHED
 THEN
 UPDATE
  SET tgt.col3=p_val3,
      tgt.col4=p_val4

 WHEN NOT MATCHED
 THEN
 INSERT  (col1, col2, col3, col4)
 VALUES  (val1, val2, val2, val4);

我收到错误消息说 col3 是无效标识符。没有拼写错误,它是现有的列。p_val1、p_val2、p_val3 和 p_val4 是传递给存储过程的字符串参数。我认为问题可能在于这些参数,也许它们应该放在 WHERE 语句中? 有什么想法吗?

【问题讨论】:

Oracle 10,我得到“PL/SQL: ORA-00904: "P"."COL3": invalid identifier" 我认为您需要:“MERGE INTO tgt”(不是 src)- 切换它们;而且我认为您不需要加入您的 src 和 tgt 表 - 只需指定:ON (src.col1 = p_val1 and src.col2 = p_val2) 哇,好一个杰拉特!谢谢你。相当偷偷摸摸 Oracle: how to UPSERT (update or insert into a table?)的可能重复 【参考方案1】:

您正在 Oracle 中寻找 merge

MERGE
       INTO  target_table tgt
      USING source_table src
         ON  ( src.object_id = tgt.object_id ) //The key to check if the record exists
       WHEN MATCHED // if exists
       THEN
     UPDATE
        SET   tgt.object_name = src.object_name //update it
        ,     tgt.object_type = src.object_type
       WHEN NOT MATCHED                         // if not exists
       THEN
     INSERT ( tgt.object_id                    //then insert
            , tgt.object_name
            , tgt.object_type )
     VALUES ( src.object_id
            , src.object_name
            , src.object_type );

【讨论】:

源和目标可以是同一个表吗?我正在尝试这样做,但我收到一个 Oracle 错误,指出其中一列(现有的)是无效标识符.... 不,我不更新我匹配的列:) 我尝试更新其他列,这就是重点...... 如果别名正确,您应该可以使用相同的源和目标。 上述语法在 Oracle 10 中不起作用。As in 无法编译。请参阅已编辑的代码问题。谢谢。 对不起,我在路上,上面的语法来自 9i,但对于 10g 应该没有太大的变化,还要注意你可以为源表使用虚拟表,很高兴它有帮助。 :)【参考方案2】:

查看 MERGE 语句

http://psoug.org/reference/merge.html

【讨论】:

以上是关于更新记录(如果存在);否则在 Oracle 中插入的主要内容,如果未能解决你的问题,请参考以下文章

如果不存在则插入,否则在 Netezza 中更新

如果记录存在则插入和更新,否则不存在竞争条件

如果 id 存在则更新,否则插入 (ODBC)

Upsert(合并)用于更新记录(如果存在),否则插入

如果已存在则更新行,否则使用 mysql 在表中插入新记录

Oracle SQL 更新查询需要几天时间才能更新