You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 22:45:36