咱们在数据库相关的开发中常常遇到这样一个问题:向数据库表中插入某条记录,如果存在就对其进行更新。例如,有以下数据表user(id为主键):sql
id | name | passwd |
1 | usr1 | pswd1 |
... | ... | ... |
向其插入id=1,name=usr1,passwd=pswd2的记录,若存在id=1的记录,则对其进行更新操做。
数据库
这个问题在单链接访问的条件下下很简单,能够先对记录执行UPDATE操做,若影响的条数为0,说明没有此记录,而后能够放心大胆的进行INSERT操做。
并发
可是在多并发访问的条件下,上述作法则存在同步问题。如果引入事务则又显得有些小题大作,如果能有一条语句以原子操做的方式完成上述功能那即是极好的。现将MySQL与Oracle的处理办法总结以下。
ide
一、MySQLspa
MySQL有两种处理方式:REPLACE 和 ON DUPLICATE KEY
事务
(1)REPLACE
开发
REPLACE与INSERT的语法相仿,形式以下:
同步
replace into table(col1,col2,...) values(val1,val2,...);
例如:it
replace into user(id,name,passwd) values(1,'usr1','pawd2');
若是插入的记录与表中原有的记录不重复,则执行INSERT操做,影响的记录数为1;若是插入的记录与表中原有的记录重复,则先DELETE原有记录,再执行INSERT,影响的记录数为2。
table
(2)ON DUPLICATE KEY
ON DUPLICATE KEY语句则是把要执行的INSERT语句和UPDATE语句链接在一块儿。其形式以下:
insert_statement on duplicate key update_statement
例如:
insert into user(id,name,passwd) values(1,'usr1','pswd2') on duplicate key update name='usr1',passwd='pswd2';
若是插入的记录与表中原有的记录不重复,则执行前半部分的INSERT操做,影响的记录数为1;若是插入的记录与表中原有的记录重复,则执行后半部分的UPDATE操做,影响的记录数为2。
二、Oracle
Oracle则主要使用merge语句进行处理。例如:
merge into user using(select 1 id,'usr1','pswd2' from dual) t on (t.id=user.id) when matched then update set user.name='usr1',user.passwd='pswd2' when not matched then insert (user.id,user.name,user.passwd) values(1,'usr1','pswd2');