SQL触发器开发需求:实现半小时内同来源符合条件数据去重插入
修正SQL触发器:实现同一ID半小时内仅插入一次符合条件的数据
需求:创建触发器,将[dbo].[table1]中
value=2的数据插入[dbo].[table2],但同一ID的符合条件数据,半小时内仅插入一次。
原代码存在的问题
- 用单个变量存储
INSERTED表数据,但INSERTED可能包含多行插入记录,这种写法会丢失大部分数据,仅处理最后一行。 - 变量名不匹配:定义了
@alert_ID,但后续使用未声明的@alert_uid;插入语句中的@alert_leak_status也未定义。 - 条件判断中的
WHERE @alert_uid = [alert_uid]是无效筛选,无法按ID过滤目标记录。
修正后的触发器代码
CREATE TRIGGER [dbo].[example_trigger] ON [dbo].[table1] AFTER INSERT AS BEGIN SET NOCOUNT ON; -- 避免返回多余的影响行数消息 -- 插入符合条件的记录:value=2,且同一ID半小时内无已插入table2的记录 INSERT INTO [dbo].[table2] (alert_uid, alert_created_at, alert_leak_status) SELECT i.ID, i.created_at, '触发' -- 此处根据实际业务需求填充alert_leak_status的值,可替换为对应字段或固定值 FROM INSERTED i WHERE i.value = 2 AND NOT EXISTS ( SELECT 1 FROM [dbo].[table2] t2 WHERE t2.alert_uid = i.ID AND t2.alert_created_at >= DATEADD(minute, -30, i.created_at) ); END
修正说明
- 采用集合查询直接处理
INSERTED表,支持一次性插入多行数据的场景。 - 通过
NOT EXISTS精准判断同一ID在半小时内是否已有记录插入table2,逻辑更可靠。 - 添加
SET NOCOUNT ON避免触发器返回额外的影响行数信息,防止干扰业务调用。 - 明确
alert_leak_status的取值(示例用固定值,可根据实际业务调整为对应字段或表达式)。
内容的提问来源于stack exchange,提问作者Jonah
相关产品推荐
相关产品推荐

