mysql在处理唯一主键记录时可以一个语句实现没有记录时插入有记录时更新, 只要使用“insert …… on duplicate key update …. ”,非常简洁高效,oracle 、 DB2 都有类似的语法可以实现相同的功能,但坑爹的是sql server没有对应的语句,但可以使用下面的语句实现相同的功能,但稍许复杂些:
- 1. 对于sql server 2008及以后的版本,可以使用merge语法, 可以参考下面的实例用法:
CREATE TABLE #mytable(COL_A VARCHAR(10), COL_B VARCHAR(10), COL_C VARCHAR(10), COL_D VARCHAR(10))
INSERT INTO #mytable VALUES('1','0.1', '0.2', '0.3');
SELECT * FROM #mytable
以上是测试数据,主要注意下面的MERGE语句用法
MERGE #mytable AS target
USING (
SELECT '1' AS VAL_A,'1.1' AS VAL_B, '1.2' AS VAL_C, '1.3' AS VAL_D
UNION
SELECT '2' AS VAL_A,'2.1' AS VAL_B, '2.2' AS VAL_C, '2.3' AS VAL_D)
AS source (VAL_A, VAL_B, VAL_C, VAL_D)
ON (target.COL_A = source.VAL_A)
WHEN MATCHED THEN
UPDATE SET
target.COL_B = source.VAL_B,
target.COL_C = source.VAL_C,
target.COL_D = source.VAL_D
WHEN NOT MATCHED THEN
INSERT (COL_A, COL_B, COL_C, COL_D)
VALUES (source.VAL_A, source.VAL_B, source.VAL_C, source.VAL_D)
;
SELECT * FROM #mytable
- 2. 对于sql server 2008以前的版本可以参考下面语句的使用方法:
update mytable
set col_d = 'val_d'
where col_a = 'val_a'
and col_b = 'val_b'
and col_c = 'val_c';
insert into mytable (col_a, col_b, col_c, col_d)
select 'val_a','val_b', 'val_c', 'val_d'
where not exists (select *
from mytable with (serializable)
where col_a = 'val_a'
and col_b = 'val_b'
and col_c = 'val_c'
);
参考:https://stackoverflow.com/questions/27076348/equivalent-of-mysql-on-duplicate-key-update-in-sql-server