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

SQL Server 编写Reservations插入后仅更新对应FLIGHT_ID的Number_Seats行的触发器

触发器逻辑缺陷说明
  • 原代码核心错误:直接关联全量Reservations业务表,而非本次插入操作触发的临时记录集,导致匹配所有历史预订对应的航班行
  • SQL Server INSERT类触发器内置inserted临时表:仅存储本次触发触发器的所有新插入记录,是精准定位目标行的核心依据
  • 原代码中JOIN Flights的逻辑为冗余操作,Number_Seats与inserted表均含FLIGHT_ID字段,可直接关联
修复后的触发器代码

适配作业单条插入场景(最小修改)

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[ajSad]
ON [dbo].[Reservations]
AFTER INSERT 
AS
BEGIN
    -- 跳过无有效插入的无效执行
    IF NOT EXISTS (SELECT 1 FROM inserted)
        RETURN

    UPDATE Number_Seats
    SET Total_Number_Seats = Total_Number_Seats - 1
    FROM Number_Seats 
    -- 仅关联本次插入的临时记录表,而非全量Reservations表
    INNER JOIN inserted ON Number_Seats.FLIGHT_ID = inserted.FLIGHT_ID
END

兼容批量插入场景(推荐,符合SQL Server最佳实践)

若作业要求支持一次插入多条预订(如批量导入),需按本次插入的同航班预订数扣减,避免仅减1的错误:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[ajSad]
ON [dbo].[Reservations]
AFTER INSERT 
AS
BEGIN
    IF NOT EXISTS (SELECT 1 FROM inserted)
        RETURN

    UPDATE ns
    SET Total_Number_Seats = Total_Number_Seats - GroupedInsert.InsertCount
    FROM Number_Seats ns
    -- 按航班分组统计本次插入的预订数量
    INNER JOIN (
        SELECT FLIGHT_ID, COUNT(*) AS InsertCount
        FROM inserted
        GROUP BY FLIGHT_ID
    ) GroupedInsert ON ns.FLIGHT_ID = GroupedInsert.FLIGHT_ID
END
测试验证

使用给定的测试插入语句执行:

INSERT INTO reservations (ID_Rezervacije, ID_Klijenta, FLIGHT_ID)
VALUES (5, 5, 5);

仅会更新Number_Seats表中FLIGHT_ID = 5的对应行,其余航班行不受影响。

内容的提问来源于stack exchange,提问作者Sleepyqt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 09:15:10