sql-server - SQL Server:我正在尝试创建一个触发器,当在表 Reservations 中插入数据时,它只更新特定行而不是所有行
问题描述
我对 SQL Server 有点陌生,并且我正在尝试解决学校的这个任务。我有 3 张桌子Flight
和.number_seats
reservations
我正在尝试创建一个触发器,因此当将数据插入 table时,它会从columnReservations
中的 table 中减去 1 个席位。Number_Seats
Total_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);
解决方案
您的触发器需要使用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
推荐阅读
- javafx - javafx中如何设置choiceBox项目列表的宽度
- php - 仅显示 60 个单词,数据库有 100 个单词
- c# - System.NotSupportedException: 'Store 没有实现 IQueryableUserStore
.':获取用户列表(自定义身份:JSON 文件) - ios - 有没有办法在 Xamarin Forms 应用程序中检测语音?
- c# - 列表
不是“IEnumerable”的子类 - java - 蓝牙插座未连接,无法配对设备
- compiler-construction - Pascal 的编译器构造 - 检测浮点数和数组格式
- arrays - 如何从 Observable 实例化对象数组
- sqlite - 使用 sqlite 作为 angular v7 的数据库
- mysql - 在 MySQL 中生成动态数据透视表