为什么我的主表列不会在触发器中递增?

时间:2013-04-19 21:41:08

标签: sql sql-server triggers

我需要创建一个触发器来跟踪从像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表中的所有记录的字段值初始化为零。

我想了解这一点,因为我想要答案,所以非常感谢您的帮助。我读到可能有更有效的方法来管理这种类型的数据,但这是我的教师想要的方式。提前谢谢!

2 个答案:

答案 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上,但触发器指的是插入。这让我很奇怪。

就在你知道的时候,我是那些赞成亚伦评论的人之一。