首页 > 数据库 > mysql教程 > SQL Server 的 MERGE 语句如何模仿 MySQL 的 ON DUPLICATE KEY UPDATE?

SQL Server 的 MERGE 语句如何模仿 MySQL 的 ON DUPLICATE KEY UPDATE?

Mary-Kate Olsen
发布: 2024-12-11 12:32:10
原创
969 人浏览过

How Does SQL Server's MERGE Statement Mimic MySQL's ON DUPLICATE KEY UPDATE?

SQL Server 对应 MySQL 的 ON DUPLICATE KEY UPDATE

在 MySQL 中,ON DUPLICATE KEY UPDATE 子句允许用户更新现有行,而不是更新现有行。如果遇到重复的键,则插入新的键。此功能在处理唯一约束和主键时特别有用。

SQL Server 的 MERGE 语句

虽然 SQL Server 没有与 MySQL 的 ON DUPLICATE KEY 完全相同的功能更新,它确实提供了 MERGE 语句作为类似的解决方案。 MERGE 将 INSERT、UPDATE 和 DELETE 语句的功能组合到单个查询中,从而可以有效处理重复值。

使用 MERGE 实现重复键更新

要在 SQL Server 中实现重复更新行为,可以使用以下命令语法:

1

2

3

4

5

6

7

MERGE INTO [target_table] AS target

USING [source_table] AS source

ON (target.[matching_column] = source.[matching_column])

WHEN MATCHED THEN

    UPDATE SET [target_column] = [source_column]

WHEN NOT MATCHED THEN

    INSERT ([target_column]) VALUES ([source_column]);

登录后复制

示例

考虑以下查询,该查询将数据插入名为 METER_DATA 的表中,并根据 rtu_id 和 time_local 更新行值(如果存在重复项) columns:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

MERGE

INTO MyBigDB.dbo.METER_DATA WITH (HOLDLOCK) AS target

USING (

    SELECT

        77748 AS rtu_id,

        '12B096876' AS meter_id,

        56112 AS meter_reading,

        '20150602 00:20:11' AS time_local

) AS source

(rtu_id, meter_id, meter_reading, time_local)

ON (target.rtu_id = source.rtu_id

AND target.time_local = source.time_local)

WHEN MATCHED

THEN UPDATE

    SET meter_id = '12B096876',

    meter_reading = 56112

WHEN NOT MATCHED

THEN INSERT (rtu_id, meter_id, meter_reading, time_local)

    VALUES (77748, '12B096876', 56112, '20150602 00:20:11');

登录后复制

此查询会将源表中的值插入到目标表中如果具有相同 rtu_id 和 time_local 的行尚不存在。如果确实存在重复行,则会执行更新,保留目标表中的现有数据。

以上是SQL Server 的 MERGE 语句如何模仿 MySQL 的 ON DUPLICATE KEY UPDATE?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板