我有2个表dbo.booking
和dbo.seat
这些结构:
dbo.booking
列noBooking, noSeat, start, [end], statusBooked
dbo.seat
列noSeat, statusSeat
我插入dbo.booking
的所有数据行(statusBooked
值设置为1)然后dbo.seat
列statusSeat
(默认为0)将更新为1。
如果statusBooked
更新为0,则statusSeat
也会更新为0.
我的意思是statusSeat
(默认情况下为0)会更新并关注statusBooked
值。
我尝试使用触发器:
ALTER TRIGGER [dbo].[TriggerUpdateSeat]
ON [dbo].[booking]
AFTER INSERT, UPDATE
AS
UPDATE dbo.seat
SET seat.statusSeat = i.statusBooked
FROM Inserted i
WHERE dbo.seat.noSeat = i.noSeat;
但问题是,当我第一次在dbo.booking
上插入数据时,dbo.seat
已填充statusSeat
必须更新为1,但未更新为1则无效。但对于第二个和前进它是有效的。 statusSeat
值的值为statusBooked
。
问题仅在我第一次运行程序并插入数据时才会发生。
为什么?
答案 0 :(得分:0)
假设您想要查看Booking中的数据以及Seat中的匹配数据。你可以通过加入来做到这一点。
select b.*, s.*
from Booking b
join Seat s
on s.noSeat = b.noSeat;
但您希望将结果集限制在座位状态值不同的位置。
select s.*, b.*
from Seat s
join Booking b
on b.noSeat = s.noSeat
and b.statusBooked <> s.statusSeat;
现在将其转换为update
语句。但是,这也是触发器的内部,所以实际上并不是预订你使用。
update s
set s.statusSeat = b.statusBooked
from Seat s
join Inserted b
on b.noSeat = s.noSeat
and b.statusBooked <> s.statusSeat;
答案 1 :(得分:0)
如果我是对的,这将解决您的问题。如果statusSeat
已更新,则statusBooked
列会在statusBooked
列中更新。如果statusSeat
已插入并且statusBooked
大于0(因为它默认为0),您的statusBooked
列将会更新为statusBooked
列。
ALTER TRIGGER [dbo].[TriggerUpdateSeat]
ON [dbo].[booking]
AFTER INSERT, UPDATE
AS
IF UPDATE (statusBooked)
BEGIN
UPDATE dbo.seat
SET seat.statusSeat = i.statusBooked
FROM Inserted i
WHERE dbo.seat.noSeat = i.noSeat;
END
ELSE
BEGIN
UPDATE dbo.seat
SET seat.statusSeat = i.statusBooked
FROM Inserted i
WHERE dbo.seat.noSeat = i.noSeat and i.statusBooked>0;
END