如何INSERT,UPDATE触发器的SQL服务器
我有2个表dbo.booking
和dbo.seat
与这些结构:如何INSERT,UPDATE触发器的SQL服务器
dbo.booking
有列noBooking, noSeat, start, [end], statusBooked
dbo.seat
有列noSeat, statusSeat
每一行我插入到dbo.booking
(设置为1),则上dbo.seat
柱statusSeat
(值缺省情况下为0)如果statusBooked
被更新为0,那么statusSeat
也将更新为0。
将更新为1。
我的意思是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
的值。
问题只发生在我第一次运行我的程序并插入数据。
为什么?
假设您想查看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;
我不明白。请详细解释一下 – azalikaEriya 2015-02-12 05:57:50
你不明白的是什么?尝试这个。在Seat中选择几行并更改statusSeat的值,以使其与Booking中的状态不匹配。然后执行上面发布的每个查询。看到所有这些为你打好的数据都是非常有启发性的。然后执行更新语句 - 除了使用Booking而不是Inserted。它工作吗?如果在任何时候有某些你不明白的东西,告诉我们你得到的结果,并告诉我们你不了解的东西。 – TommCatt 2015-02-12 18:24:06
如果是正确的,这将解决您的问题。如果statusBooked
已更新,您的statusSeat
列将更新为statusBooked
列。如果statusBooked
插入且statusBooked
大于0(因为它默认为0),并且您的statusSeat
列将更新为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
看起来你的桌子'座位'通过'noSeat'列引用预订 - 对吗?那么为什么你甚至需要'statusSeat'列呢?只需连接到'dbo.Booking'表并读出'statusBooked' - 没有必要让两列包含相同的信息,并且担心让它们保持同步 - 避免这种数据冗余! – 2015-02-12 05:59:06
是的,通过noSeat列的座位引用预订。 ,因为我有一些座位,我想显示哪些预订和哪些可用,所以我添加了statusSeat。 statusBooked仅用于“交易”状态。如果我没有添加statusSeat,我将很难在另一个案例中执行我的项目。那么如何解决我上面的问题? @marc_s – azalikaEriya 2015-02-12 06:23:57