2013-05-02 78 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