首页 > 解决方案 > 覆盖静态 INSERT 语句中的重复行

问题描述

我将使用一个INSERT语句插入行,其中值是静态的,并且尚未在数据库中。就像是:

INSERT INTO MY_TABLE (ID, NAME) VALUES(123, 'Herbert')

如果MY_TABLE已经有一行ID等于123NAMEis Herbie,我如何将新数据保留在INSERT语句 ( 123, Herbert) 中并丢弃MY_TABLE( 123, Herbie) 中已有的数据?

我知道 SQL ServerIGNORE_DUP_KEY设置,但我认为这会忽略INSERT语句中的数据并保留表中已经存在的数据。我想要反过来。

更新

澄清一下,我不想更改INSERT声明。我想保持不变。我想以某种方式在服务器端完成工作。基本上IGNORE_DUP_KEY是我想要的,除了它保留了错误的数据。

更新 2

我认为我想做的与提到的重复问题不同。我根本不想改变INSERT声明。我想在后端使用我不知道的 SQL Server 设置来处理它,或者可能通过创建触发器来处理它。

标签: sql-serverazure-sql-database

解决方案


好的,我想我有一些有用的东西。它只是一个基本INSTEAD OF INSERT触发器,如果​​表上的行已经存在,则删除该行,然后插入新行。每次向表中插入一行时都会运行此触发器。

CREATE TRIGGER TR_MY_TABLE_IN ON MY_TABLE
INSTEAD OF INSERT
AS
BEGIN 
    SET NOCOUNT ON;

    DELETE FROM MY_TABLE WHERE ID IN (SELECT ID FROM INSERTED)
    INSERT INTO MY_TABLE SELECT * FROM INSERTED

END

推荐阅读