【问题标题】:Oracle DB equivalent of on duplicate key updateOracle DB 等效于重复键更新
【发布时间】:2019-06-21 16:06:02
【问题描述】:

我需要在 Oracle 中执行以下 MySQL 查询:

INSERT INTO users VALUES(1,10) ON DUPLICATE KEY UPDATE points = 10;

除了merge,还有别的吗?我只是不明白。

【问题讨论】:

    标签: sql oracle


    【解决方案1】:

    如果不想使用MERGE,可以试试:

    begin
       INSERT INTO users VALUES(1,10);
    
       exception
          when dup_val_on_index then
             update users
                set points = 10
              where id = 1;
    end;
    

    【讨论】:

      【解决方案2】:
      MERGE INTO users u
      USING (SELECT 1 as id FROM dual) a
      ON a.id = u.id
      WHEN MATCHED THEN UPDATE SET u.points = 10
      WHEN NOT MATCHED THEN INSERT (id, points) VALUES (1, 10);
      

      【讨论】:

        【解决方案3】:

        您需要使用MERGE。类似的东西

        MERGE INTO users dest
          USING( SELECT 1 user_id, 10 points FROM dual) src
             ON( dest.user_id = src.user_id )
         WHEN MATCHED THEN
           UPDATE SET points = src.points
         WHEN NOT MATCHED THEN
           INSERT( user_id, points ) 
             VALUES( src.user_id, src.points );
        

        【讨论】:

        • 小心使用 UPDATE 来增加计数器!您必须为 src 和 dst 使用别名,UPDATE SET COUNTER = dst.COUNTER + src.COUNTER,否则默认取 src 值! UPDATE SET COUNTER = COUNTER + src.COUNTER(左侧参数默认使用 src.COUNTER)
        猜你喜欢
        • 1970-01-01
        • 2011-11-18
        • 1970-01-01
        • 2011-01-29
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 2010-10-26
        相关资源
        最近更新 更多