我需要创建一个触发器来跟踪从像Blockbuster这样的商家租借电影的次数。我需要一个单独的触发器来进行插入,删除和更新。
跟踪租借次数的列称为num_rentals,其数据类型为int。此列是电影表的一部分,该表包含* movie_id(pk *),movie_title,release_year,movie_description和num_rentals。 customer_rentals 表格包含item_rental_id(pk),* movie_id(fk *),customer_id。
我在这里搜索并找到了一个类似的线程并尝试使用提供的答案,但无济于事。我执行了以下字符串没有任何错误,但是当我将数据插入Movie或Customer_rentals表时,我看到num_rentals列没有变化。我做错了什么?
CREATE TRIGGER dbo.tr_num_rented_insert ON dbo.customer_rentals
FOR INSERT
AS
BEGIN
UPDATE m
SET num_rentals = num_rentals + 1
FROM dbo.movies AS m
INNER JOIN inserted AS i ON m.movie_id = i.movie_id ;
END
我稍后将num_rentals字段添加到表中,我还需要知道如何将当前在Movies表中的所有记录的字段值初始化为零。
我想了解这一点,因为我想要答案,所以非常感谢您的帮助。我读到可能有更有效的方法来管理这种类型的数据,但这是我的教师想要的方式。提前谢谢!
答案 0 :(得分:0)
我怀疑你的问题是null num_rental列。所以你要将null添加到1,结果为null。
就个人而言,我将num_rentals列设置为非可空,默认值为零,但假设您不能这样做,请使用isnull()。
喜欢这样
alter TRIGGER dbo.tr_num_rented_insert ON dbo.customer_rentals
FOR INSERT
AS
BEGIN
UPDATE m
SET num_rentals = isnull(num_rentals,0) + 1
FROM dbo.movies AS m
INNER JOIN inserted AS i ON m.movie_id = i.movie_id ;
END
然而,尽管这有效,但它存在问题;如果你向customer_rentals添加多行,它只会增加一行。就个人而言,我会更改触发器来解释这一点。
喜欢这个
alter TRIGGER dbo.tr_num_rented_insert ON dbo.customer_rentals
FOR INSERT
AS
BEGIN
UPDATE m
SET num_rentals = isnull(num_rentals,0) + (select COUNT(*) from inserted where movie_id = m.movie_id)
FROM dbo.movies AS m
where movie_id in (select movie_id from inserted)
END
就重复信息而言,Aaron是对的,这是不必要的冗余,根据我的经验,这种类型的东西经常不同步。有了这么简单的数据库,num_rentals列太过分了(很慷慨),但是你的电影数据库是一个人为的例子来教你一个概念。基本上,有时您会希望可以轻松访问或过滤计算值。以SO代表为例,我假设他们每次显示时都不会重新计算。
答案 1 :(得分:-1)
Aaron经常被评论表明你做的事情是不明智的。但是,由于您正在执行教师指定的内容,因此我建议您查看几个方面。
首先,您的更新查询是否适用于初始租赁?如果初始值为0,它将。如果初始值为null,则不会。
其次,您可能引用了错误的表。触发器在customer_rentals上,但触发器指的是插入。这让我很奇怪。
就在你知道的时候,我是那些赞成亚伦评论的人之一。