2013-05-02 75 views
0

我想在更新另一個表時更改表中所有行的字段。
我有一張遊戲桌,一張裁判表(帶有nation_id)和國家名單。

現在我想自動更新遊戲表中的referee_nation_Name,如果有人更新裁判表中的nation_id。
我的問題是我不知道如何獲取referee_id(這是唯一的),當有人更新此表中的nation_id。如果我選擇所有referee_id它們是這樣的:我new.nation_id會得到人民的其他裁判IDS誰生活在這個國家......這裏是我的非工作觸發:ORACLE TRIGGER更新表,如果另一個更新

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; 
+0

爲什麼你首先在「裁判」表中存儲國家的名字?你的數據模型應該正確的標準化。所以如果你已經有了一個已經存儲的「國家」表,那麼你不應該存儲裁判國的名字。 – 2013-05-02 21:51:38

+0

我知道,但它是爲了學校。所以我必須這樣做...... ^^ – user1069968 2013-05-02 21:54:26

+0

你在你的select語句中缺少連接條件(如果你使用明確的'JOIN'則不會發生) – 2013-05-02 22:12:03

回答

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

+0

謝謝你的工作,但我剛剛看到我的更新聲明沒有完成在這裏。所以我仍然需要refree_id,如果我只想更新遊戲表中的正確referee_nation_Name。 – user1069968 2013-05-02 22:26:17

+0

@ user1069968 - 對不起,我以爲你在說'referee_nation_name'在'referee'表中不在'game'表中。更新了我的答案。僅供參考,如果您發佈DDL來創建對象和一些示例數據,以便我們可以測試我們的答案,那將會很有幫助。 – 2013-05-02 23:17:32