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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-12-11 12:32:10926浏览

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 中实现重复更新行为,可以使用以下命令语法:

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:

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn