0

Blockbuster のような企業から映画がレンタルされた回数を追跡するトリガーを作成する必要があります。挿入、削除、更新用に個別のトリガーが必要です。

このレンタル回数を追跡する列は num_rentals と呼ばれ、データ型は int です。この列は、*movie_id (pk*)、movie_title、release_year、movie_description、および num_rentals を持つMoviesテーブルの一部です。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 テーブルにあるすべてのレコードのフィールド値をゼロに初期化する方法も知っておく必要があります。

答えが欲しいのと同じくらいこれを理解したいので、助けていただければ幸いです。この種のデータを管理するためのより効率的な方法があるかもしれないと読みましたが、これが私のインストラクターが望んでいる方法です。前もって感謝します!

4

2 に答える 2

0

あなたの問題はnull num_rental列だと思います。したがって、null を 1 に追加すると、null になります。

個人的には、num_rentals 列をデフォルトのゼロで null 非許容に設定しますが、それができない場合は、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 に追加すると、1 だけ増加します。個人的には、それを考慮してトリガーを変更します。

このような

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

重複した情報に関する限り、これは不必要に冗長であり、私の経験では、この種のことはしばしば同期されないというアーロンの意見は正しい. このような単純なデータベースでは、num_rentals 列は過剰 (寛大であるために) ですが、映画データベースは概念を教えるための不自然な例です。基本的に、計算された値に簡単にアクセスしたり、フィルタリングしたりしたい場合があります。SO担当者を例にとると、表示するたびに再計算しないと思います。

于 2013-04-20T00:13:44.750 に答える