在 MYSQL中,实现要实现在一张表中”更新一条信息,如果不存在则插入“,通常是用ON DUPLICATE KEY UPDATE实现的。举个例子,现在有个应用场景,在客户表(CUSTOMER)里添加一条数据,如果存在该客户(通过主键客户号和账号判断)则更新该客户的手机号(CUST_MOBILE)、购买次数(BUY_TIMES)和购买日期(BUY_DATE)。
NAME | CODE | PRIMARY |
---|---|---|
客户号 | CUST_NO | ✔️ |
客户账号 | CUST_ACCT | ✔️ |
客户姓名 | CUST_NAME | |
客户手机号 | CUST_MOBILE | |
购买次数 | BUY_TIMES | |
购买日期 | BUY_DATE |
使用MYSQL ON DUPLICATE KEY UPDATE 实现
insert into CUSTOMER
(
CUST_NO,
CUST_ACCT,
CUST_NAME,
CUST_MOBILE,
BUY_TIMES,
BUY_DATE
)
values(
#{CUST_NO},
#{CUST_ACCT},
#{CUST_NAME},
#{CUST_MOBILE},
'1',
${BUY_DATE}
)
ON DUPLICATE KEY UPDATE
CUST_MOBILE=#{CUST_MOBILE},
BUY_TIMES=BUY_TIMES+1,
BUY_DATE=#{_CURR_DATE}
那么在ORACLE中,如何使用语句实现类似MYSQL中 使用ON DUPLICATE KEY UPDATE 语句的效果呢,语句如下所示
merge into CUSTMOER t1
using (select #{CUST_NO} CUST_NO,#{CUST_ACCT} CUST_ACCT from dual)t2
on (t1.CUST_NO=t2.CUST_NO and t1.CUST_ACCT=t2.CUST_ACCT)
when matched then
update set
t1.CUST_MOBILE=#{CUST_MOBILE},
t1.BUY_TIMES=BUY_TIMES+1,
t1.BUY_DATE=#{_CURR_DATE}
where t1.CUST_NO=#{CUST_NO} and t1.CUST_ACCT=#{CUST_ACCT}
when not matched then insert(
t1.CUST_NO,
t1.CUST_ACCT,
t1.CUST_NAME,
t1.CUST_MOBILE,
t1.BUY_TIMES,
t1.BUY_DATE
)
values
(
#{CUST_NO},
#{CUST_ACCT},
#{CUST_NAME},
#{CUST_MOBILE},
'1',
#{_CURR_DATE}
)
关于ORACLE 的 dual表,感兴趣的同学可以参考
http://www.cnblogs.com/qiangqiang/archive/2010/10/15/1852229.html