Replace into与Merge into的用法总结

MySQL中replace into用法总结

插入一条数据,存在则不操作,不存在就插入(必须现有唯一键)

使用insert ignore语句:

insert ignore into table(col1,col2) values ('a','b');

这样一来,如果表中已经存在的数据,就不会插入,如果没有就会插入一条新数据。

插入一条数据,存在就更新,不存在就插入(必须现有唯一键)

这种有两种操作方法:

1、INSERT…ON DUPLICATE KEY UPDATE的使用

如果指定了ON DUPLICATE KEY UPDATE,并且插入行后会导致在一个UNIQUE索引或PRIMARY KEY中出现重复值,则执行UPDATE。

例如,如果列a被定义为UNIQUE,并且包含值1,则以下两个语句具有相同的效果:

INSERT INTO table (a,b,c) VALUES (1,2,3)  ON DUPLICATE KEY UPDATE c=c+1; 
UPDATE table SET c=c+1 WHERE a=1; 

如果行作为新记录被插入,则受影响行的值为1;如果原有的记录被更新,则受影响行的值为2。

2、REPLACE关键字的使用

使用REPLACE的最大好处就是可以将DELETE和INSERT合二为一,形成一个原子操作。这样就可以不必考虑在同时使用DELETE和INSERT时添加事务等复杂操作了。

在使用REPLACE时,表中必须有唯一索引,而且这个索引所在的字段不能允许空值,否则REPLACE就和INSERT完全一样的。

在执行REPLACE后,系统返回了所影响的行数,如果返回1,说明没有重复的记录,如果返回2,说明有重复记录,系统先DELETE这条记录,然后再INSERT这条记录。

语法和INSERT非常的相似,如下面的REPLACE语句是插入或更新一条记录。

REPLACE INTO users (id,name,age) VALUES(123, '张三', 22); 
Oracle中Merge into用法总结

Oracle中,要实现相同的功能,要用到Merge into来实现(Oracle 9i引入的功能),其语法如下:

MERGE INTO table_name alias1 
USING (table|view|sub_query) alias2
ON (join condition) 
WHEN MATCHED THEN 
    UPDATE table_name 
    SET col1 = col_val1, 
           col2 = col_val2 
WHEN NOT MATCHED THEN 
    INSERT (column_list) VALUES (column_values);

严格意义上讲,”在一个同时存在Insert和Update语法的Merge语句中,总共Insert/Update的记录数,就是Using语句中alias2的记录数”。所以,要实现上面的功能,可以这样写:

MERGE INTO T T1
USING (SELECT '1001' AS a,2 AS b FROM dual) T2
ON ( T1.a=T2.a)
WHEN MATCHED THEN
    UPDATE SET T1.b = T2.b
WHEN NOT MATCHED THEN 
    INSERT (a,b) VALUES(T2.a,T2.b);
Sql Server中Merge into 用法总结

MERGE语句用来合并UPDATE和INSERT语句。
通过MERGE语句,根据一张表或子查询的连接条件对另外一张表进行查询,
连接条件匹配上的进行UPDATE,无法匹配的执行INSERT。
这个语法仅需要一次全表扫描就完成了全部工作,执行效率要高于INSERT+UPDATE。

语法:

MERGE [INTO [schema .] table [t_alias] 
USING [schema .] { table | view | subquery } [t_alias] 
ON ( condition ) 
WHEN MATCHED THEN merge_update_clause 
WHEN NOT MATCHED THEN merge_insert_clause;

下面是主要的同步操作

MERGE INTO - 数据的目的地,将数据最终 MERGE 到的表对象

USING 与源表连接 ON 关联的条件

WHEN MATCHED - 如果匹配成功,即关联条件成功 (这时就应该将 SOURCE 中其它的所有字段值更新到 TARGET 表中)

WHEN NOT MATCHED BY TARGET - 如果匹配不成功 (TARGET 中没有这一条记录但是 SOURCE 表有,说明 SOURCE 表多了新数据因此应该插入到 TARGET 表中)

WHEN NOT MATCHED BY SOURCE - 如果匹配不成功 (SOURCE 中没有这一条记录但是 TARGET 表有,说明 SOURCE 表可能把这条数据删除了,所以 TARGET 也应该删除)

MERGE INTO @TargetTable AS T           
USING @SourceTable AS S                
   ON T.ID = S.ID                      
WHEN MATCHED         
   THEN UPDATE SET T.DSPT = S.DSPT  
WHEN NOT MATCHED BY TARGET   
   THEN INSERT VALUES(S.ID,S.DSPT)
WHEN NOT MATCHED BY SOURCE            
   THEN DELETE
OUTPUT $ACTION AS [ACTION],
   Deleted.ID AS 'Deleted ID',
   Deleted.DSPT AS 'Deleted Description',
   Inserted.ID AS 'Inserted ID',
   Inserted.DSPT AS 'Inserted Description'
INTO @Log;

还要注意的是有一些限制条件:

  • 在 Merge Matched 操作中,只能允许执行 UPDATE 或者 DELETE 语句。
  • 在 Merge Not Matched 操作中,只允许执行 INSERT 语句。
  • 一个 Merge 语句中出现的 Matched 操作,只能出现一次 UPDATE 或者 DELETE 语句,否则就会出现下面的错误 -An action of type ‘WHEN MATCHED’ cannot appear more than once in a ‘UPDATE’ clause of a MERGE statement.
  • Merge 语句最后必须包含分号,以 ; 结束。
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 并没有提供 MERGE INTO 语句,但可以通过其他方式实现相同的功能。下面介绍两种方法: 1. 使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句 这种方法需要先根据需要更新的条件来查询目标表,然后使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句来更新或插入数据,具体步骤如下: ``` INSERT INTO target_table (col1, col2, col3) SELECT source_col1, source_col2, source_col3 FROM source_table WHERE source_condition ON DUPLICATE KEY UPDATE col1 = VALUES(col1), col2 = VALUES(col2), col3 = VALUES(col3); ``` 其中,target_table 是需要更新或插入数据的目标表,source_table 是需要更新或插入数据的源表,source_condition 是需要更新或插入数据的条件,VALUES(col) 表示使用插入语句中的值来更新对应的列。 该语句会先根据 source_condition 查询出需要更新或插入的数据,然后使用 INSERT INTO ... ON DUPLICATE KEY UPDATE 语句来更新或插入数据。如果插入的数据已经存在于目标表中,则会更新对应的列,否则会插入一条新的数据。 需要注意的是,该方法需要保证目标表中的主键或唯一索引列必须存在,并且需要根据具体情况进行调整和优化。 2. 使用 REPLACE INTO 语句 这种方法可以直接使用 REPLACE INTO 语句来实现更新或插入数据的功能,具体步骤如下: ``` REPLACE INTO target_table (col1, col2, col3) SELECT source_col1, source_col2, source_col3 FROM source_table WHERE source_condition; ``` 其中,target_table 是需要更新或插入数据的目标表,source_table 是需要更新或插入数据的源表,source_condition 是需要更新或插入数据的条件。 该语句会直接将 source_table 中符合条件的数据插入到 target_table 中,如果插入的数据已经存在于目标表中,则会先删除已有的数据,然后再插入新的数据。 需要注意的是,该方法会先删除已有的数据,再插入新的数据,因此可能会对数据产生影响,需要谨慎使用。同时,该方法也需要保证目标表中的主键或唯一索引列必须存在,并且需要根据具体情况进行调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值