我将使用INSERT
语句插入行,其中值是静态的,并且不在数据库中。像这样:
INSERT INTO MY_TABLE (ID, NAME) VALUES(123, 'Herbert')
如果MY_TABLE
已经有ID
等于123
的行,但是NAME
是Herbie
,如何将新数据保留在{ {1}}语句(INSERT
,123
)并丢弃Herbert
(MY_TABLE
,123
)中已经存在的内容?
我知道SQL Server Herbie
的设置,但是我认为它会忽略IGNORE_DUP_KEY
语句中的数据,并保留表中已经存在的数据。我要相反。
为了澄清,我不想更改INSERT
语句。我要保持不变。我想以某种方式在服务器端进行工作。基本上INSERT
是我想要的,除了它保留了错误的数据。
我认为我要做的事情与提到的重复问题有所不同。我根本不想更改IGNORE_DUP_KEY
语句。我想在后端使用我不知道的SQL Server设置来处理它,或者通过创建触发器来处理它。
答案 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')