一条sql语句执行:有则更新,无则新增

一、Oracle、Sqlserver数据库:(merge into)

通过Merge into你能够在一个SQL语句中对一个表同时执行inserts和updates操作. 当然是update还是insert是依据于你的指定的条件判断的,Merge into可以实现用B表来更新A表数据,如果A表中没有,则把B表的数据插入A表。

1、Merge into的基本语法

	MERGE INTO [表名] [表别名] 
	USING ( [查询内容] )[或者像表查询一样的语句] 
	ON ([条件表达式] AND [...]...) 
	WHEN MATHED THEN [匹配的update操作] 
	WHEN NOT MATHED THEN [不匹配的insert操作] 

例:

	MERGE INTO  UAM_LOCK  A
	USING (SELECT '123' as CUSTOMERID, 'L' as STATUS_CODE FROM dual) B on (A.CUSTOMERID=B.CUSTOMERID)
	WHEN MATCHED THEN UPDATE SET A.STATUS-CODE=B.STATUS_CODE
	WHEN NOT MATCHED THEN  INSERT (A.CUSTOMERID, A.STATUS_CODE) VALUES (B.CUSTOMERID, B.STATUS_CODE )

注意事项:

Merge Into的原理是,从using 搜出来的结果逐条与on条件匹配,然后决定是update还是Insert。 当USING后面的sql没有查询到数据的时候,Merge Into语句是不会执行update和Insert操作的。

所以要想让Merge Into正常运行,要保证USING 后面的SELECT有数据,个人喜欢使用DUAL表作为USING后的表,方便自己控制。

二、Mysql数据库:

1、REPLACE INTO
发现重复的先删除再插入,如果记录有多个字段,在插入的时候如果有的字段没有赋值,那么新插入的记录这些字段为空。

replace into uam_lock(customerid,status_code) select '123','L';
或
replace into uam_lock(customerid,status_code) values('123','L');

注意的是:插入数据的表必须有主键或者是唯一索引!否则的话,replace into 会直接插入数据,这将导致表中出现重复的数据。

2、INSERT INTO ON DUPLICATE KEY UPDATE
发现重复的是更新操作。在原有记录基础上,更新指定字段内容,其它字段内容保留。

insert into uam_lock(customerid,status_code) values('123','L') on DUPLICATE KEY UPDATE status_code=‘O’;

3、IGNORE INTO
判断是否存在,存在不插入,否则插入。

insert ignore into uam_lock(customerid,status_code) values('123','L');

当执行这条sql语句时,如果数据库中已经存在相同的记录,则数据库会忽略该条命令,返回的受影响的行数为0.

你可能感兴趣的:(数据库)