覆盖静态INSERT语句中的重复行

时间:2018-07-31 18:39:35

标签: sql-server azure-sql-database

我将使用INSERT语句插入行,其中值是静态的,并且不在数据库中。像这样:

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

如果MY_TABLE已经有ID等于123的行,但是NAMEHerbie,如何将新数据保留在{ {1}}语句(INSERT123)并丢弃HerbertMY_TABLE123)中已经存在的内容?

我知道SQL Server Herbie的设置,但是我认为它会忽略IGNORE_DUP_KEY语句中的数据,并保留表中已经存在的数据。我要相反。

更新

为了澄清,我不想更改INSERT语句。我要保持不变。我想以某种方式在服务器端进行工作。基本上INSERT是我想要的,除了它保留了错误的数据。

更新2

我认为我要做的事情与提到的重复问题有所不同。我根本不想更改IGNORE_DUP_KEY语句。我想在后端使用我不知道的SQL Server设置来处理它,或者通过创建触发器来处理它。

2 个答案:

答案 0 :(得分:0)

好的,我认为我有一些可行的方法。这只是一个基本的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

答案 1 :(得分:0)

如我所见,您有2个选择。

首先,您可以从ID =您的ID的表中删除。这可以不必担心ID是否已经存在,因为删除不存在的记录不会在SQL中产生错误。如果您坚持只使用插入语句,那么这是您的选择。

添加

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

第二,您可以添加“检查”以查看ID是否已存在,并根据ID是否已存在有一个Insert语句和Update语句。

If(select ID from MY_TABLE where ID = 123)
    Update MY_TABLE
     Set NAME = 'Herbert'
    Where ID = 123
ELSE
    INSERT INTO MY_TABLE (ID, NAME) VALUES(123, 'Herbert')