首页 > 解决方案 > SQL Server:我正在尝试创建一个触发器,当在表 Reservations 中插入数据时,它只更新特定行而不是所有行

问题描述

我对 SQL Server 有点陌生,并且我正在尝试解决学校的这个任务。我有 3 张桌子Flight和.number_seatsreservations

我正在尝试创建一个触发器,因此当将数据插入 table时,它​​会从columnReservations中的 table 中减去 1 个席位。Number_SeatsTotal_Number_Seats

我遇到的问题是我的WHERE目标是所有行,所以当我将数据插入 tableReservations时,它​​会影响所有行,而不仅仅是具有相同的特定行FLIGHT_ID

我意识到我的WHERE子句不够具体,但我不知道如何编写它,因此它针对插入的特定行。因此,如果可以的话,请提供帮助:)。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER TRIGGER [dbo].[ajSad]
ON [dbo].[Reservations]
AFTER INSERT 
AS
BEGIN
    UPDATE Number_Seats
    SET Total_Number_Seats = Total_Number_Seats - 1
    FROM Number_Seats 
    JOIN Flights ON Number_Seats.FLIGHT_ID = FLIGHTS.FLIGHT_ID
    JOIN Reservations ON Flights.Flight_ID = Reservations.Flight_ID
    WHERE Reservations.FLIGHT_ID = Number_Seats.Flight_ID
END
INSERT INTO reservations (ID_Rezervacije, ID_Klijenta, FLIGHT_ID)
VALUES (5, 5, 5);

标签: sql-server

解决方案


您的触发器需要使用inserted虚拟表仅更新相关的行flight_Id(s)

触发器上下文中的inserted表将包含在单个批次中插入的所有行 - 这可能是一个或多个,您需要假设它可能不止一个。

您需要计算新预订的数量(大概是每个预订 1 行)并按每个分组flight_Id,然后减少每个预订的总数flight_Id

with t as (
    select flight_Id, Count(*) tot
    from inserted
    group by flight_Id
)

update ns set
    total_number_seats -= tot
from t
join number_seats ns on ns.flight_Id=t.flight_Id

推荐阅读