在SQL中触发对列进行计数,并在超过特定值时给出错误
我需要一个触发器来避免为列插入特定值,例如,在预订表中,我有一个bookingId和invoiceId。我想计算每张发票的BookingID,并将该数字与航空公司表中名为MaxBooking的数字进行比较。如果号码超过MaxBooking,则意味着我无法再使用该发票号码预订在SQL中触发对列进行计数,并在超过特定值时给出错误,sql,sql-server,triggers,Sql,Sql Server,Triggers,我需要一个触发器来避免为列插入特定值,例如,在预订表中,我有一个bookingId和invoiceId。我想计算每张发票的BookingID,并将该数字与航空公司表中名为MaxBooking的数字进行比较。如果号码超过MaxBooking,则意味着我无法再使用该发票号码预订 |bookingId|invoiceId|passengerId|FlightId| |1 |101 |20 |99 | |1 |1
|bookingId|invoiceId|passengerId|FlightId|
|1 |101 |20 |99 |
|1 |101 |20 |99 |
|1 |101 |20 |99 |
|1 |101 |20 |99 |
|FlightId |AirlineId|
|99 |500 |
|AirlineId|AirlineName |MaxBooking|
|500 |Biritish Airway|4 |
你应该更好地解释你的问题。你可能正在寻找下面这样的东西。这只是一个例子,不值得使用
if exists (select top 1 1 from booking b
join flight f on f.bookingid = b.bookingid
join airline a on a.airlineid = f.airline_id
join inserted i on i.bookingid = b.bookingid
where (select count(*) from booking bb where bb.bookingid = b.booking_id) > f.maxbooking
)
begin
rollback tran
end
然而,在预订桌上似乎没有好的钥匙,当您在5排和最多4排时,您应该怎么做。前4个是低谷吗?这将使查询更加复杂 这就是您正在搜索的精确解决方案 我假设表名为: 1.dbo.航班预订 2.dbo.Flights 3.dbo.航空公司 根据他们在你问题中的表现
CREATE TRIGGER [dbo].[trg_restrictMaxBooking]
ON [dbo].[FlightBookings]
INSTEAD OF INSERT
AS
BEGIN
SET NOCOUNT ON;
BEGIN TRANSACTION
DECLARE @FlightId INT
SELECT @FlightId=I.FlightId FROM inserted I
IF((SELECT COUNT(*) FROM dbo.FlightBookings WHERE FlightId=@FlightId)<ISNULL((SELECT MaxBooking FROM dbo.Airlines WHERE AirlineId=(SELECT AirLineId FROM dbo.Flights WHERE FlightId=@FlightId)),0))
BEGIN
ROLLBACK TRANSACTION
RAISERROR('Failed',16,1)
RETURN
END
COMMIT TRANSACTION
END
GO
如果您需要任何进一步的帮助或我遗漏了什么,请告诉我。标签似乎不明确。。。这是MySQL还是SQL Server?你尝试过什么,但什么不起作用?这是在sql中,实际上我在sql中很重要,我对触发器没有足够的了解。当触发器检测到错误时,你总是希望按顺序执行以下操作:回滚、RAISERROR,然后返回。不建议将触发器编码为只处理一行,就像这里的代码一样。如果使用一个命令插入多行,那么您的代码将只验证一行。