数据库 INSERT OR UPDATE 问题总结

    咱们在数据库相关的开发中常常遇到这样一个问题:向数据库表中插入某条记录,如果存在就对其进行更新。例如,有以下数据表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');
相关文章
相关标签/搜索