首页 > 技术文章 > Sql UpdateOrInsert

lcawen 2019-09-09 11:36 原文

SqlServer(先更新,受影响条数为0,则Insert,通过事务):

begin tran
    update table set  column=columnvalue   where wherestr
if @@ROWCOUNT==0
begin
    insert into table (column) values (columnvalue)
end 
commit tran

Oracle(Merge Into的原理是,从using 搜出来的结果逐条与on条件匹配,然后决定是update还是Insert):

MERGE INTO table t  
--USING (SELECT whereStrColumn FROM SYS.DUAL) s 大部分情况下使用SYS.DUAL是个好的选择,但是如果同时插入或更新通过个主键,会导致ORA-00001违反唯一键约束
USING (SELECT whereStrColumn FROM table where whereStr) s 
ON  (t.whereStrColumn=s.whereStrColumn) 
WHEN MATCHED 
THEN UPDATE SET column=columnValue
WHEN NOT MATCHED THEN INSERT  (column) VALUES (columnValue)

MySql(Mysql语法提供了):

INSERT INTO table  
(column)  VALUES (columnValue)   
ON DUPLICATE KEY UPDATE   
column=columnValue

 

推荐阅读