0

別のテーブルを更新するときに、テーブルのすべての行のフィールドを変更したいと考えています。
ゲームテーブル、審判テーブル (nation_id 付き)、および国家テーブルがあります。

誰かが審判テーブルのnation_idを更新した場合、ゲームテーブルからrefee_nation_Nameを自動更新したいと思います。
私の問題は、誰かがこのテーブルの national_id を更新したときに (一意の) referee_id を取得する方法がわからないことです。:new.nation_id のようなすべての referee_id を選択すると、この国に住んでいる人々から他の審判 ID を取得します...これが私の非機能トリガーです:

CREATE OR REPLACE TRIGGER name
AFTER UPDATE OF nation_id ON referee
FOR EACH ROW
DECLARE
    nationname VARCHAR2(150);
BEGIN
    SELECT n.name INTO nationname
            FROM nation n, referee r, game g
      WHERE n.nation_id = r.nation_id AND g.referee_id = :old.referee_id);
    UPDATE game SET referee_nation_Name = nationname WHERE referee_id = :old.referee_id;
END;
4

1 に答える 1

2

このように非正規化されたデータを格納するデータ モデルを設計することは絶対にないということを知っているので、インストラクターはおそらく次のようなものを探しています。

CREATE OR REPLACE TRIGGER name
  BEFORE UPDATE OF nation_id ON referee
  FOR EACH ROW
DECLARE
    l_nationname VARCHAR2(150);
BEGIN
    SELECT name
      INTO l_nationname 
      FROM nation
     WHERE nation_id = :new.nation_id;

    UPDATE game
       SET referee_nation_name = l_nationname
     WHERE referee_id = :new.referee_id;
END;

もちろん、これは、誰かがnationテーブルを更新してname他の可能性のあるホールを変更したときに何が起こるかには対応していません。

于 2013-05-02T22:09:31.433 に答える