【发布时间】:2021-04-05 00:10:15
【问题描述】:
我可以检测到重复记录,但是当我插入新数据时,即使不存在,它也会将其检测为重复记录。
这是我的代码:
ALTER TRIGGER [dbo].[SDPRawInventory_Dup_Trigger]
ON [dbo].[SDPRawInventory]
AFTER INSERT
AS
DECLARE @Year float,
@Month float,
@SDPGroup nvarchar(255);
SELECT
@Year = i.InvYear, @Month = i.InvMonth, @SDPGroup = i.SDPGroup
FROM inserted i;
IF (SELECT COUNT(*) FROM SDPRawInventory A
WHERE A.InvYear = @Year
AND A.InvMonth = @Month
AND A.SDPGroup = @SDPGroup) >= 1
BEGIN
RAISERROR ('Duplicate data', 16, 1)
ROLLBACK;
END
ELSE
BEGIN
INSERT INTO SDPRawInventory
SELECT * FROM inserted;
END
这是桌子
为了澄清没有主键也没有唯一标识符。
【问题讨论】:
-
您的触发器存在基本 缺陷,您似乎认为它会每行调用一次 - 事实并非如此。触发器将每条语句触发一次,因此如果您的
INSERT导致此触发器触发插入25 行,您将触发触发器一次 和@987654325 @ 伪表将包含 25 行。您的代码将从Inserted中选择这 25 行中的哪一行?它是不确定的,您将获得任意行,而您将忽略所有其他行。您需要重写触发器以考虑到这一点! -
@marc_s 在防止重复记录的同时插入多行有什么想法吗?抱歉,我是使用触发器的新手。
-
您为什么使用
float表示年份和月份?应该只是int -
一个简单的
UNIQUE CONSTRAINT绝对是处理这个问题的最简单和最有效的方法......
标签: sql sql-server tsql triggers