2013-05-02 3 views
0

Я хочу изменить поле во всех строках таблицы при обновлении другого.
У меня есть игровой стол, таблица рефери (с нацией) и таблица нации.

Теперь я хочу автоматически обновить referee_nation_Name из таблицы игр, если кто-то обновит national_id в таблице рефери.
Моя проблема в том, что я не знаю, как получить рефери_ид (который уникален), когда кто-то обновляет national_id в этой таблице. Если я выбрать все referee_id, которые являются как: new.nation_id я буду получать другие судейские идентификаторы из народов, жизнь в этой стране ... вот мой нерабочем триггер:Таблица обновлений 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

Почему вы храните имя нации в таблице «рефери» в первую очередь? Ваша модель данных должна быть правильно нормирована. Таким образом, вы не должны хранить имя нации рефери, если у вас уже есть ссылка на таблицу 'nation', где она уже сохранена. –

+0

Я знаю, но это для школы. так что я должен это сделать ... ^^ – user1069968

+0

Вам не хватает условия соединения в вашем заявлении select (не произойдет, если вы использовали явный 'JOIN') –

ответ

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, если я хочу только обновить правое имя_имени_имя_имя в таблице игр. – user1069968

+0

@ user1069968 - Извините, я думал, что вы говорите, что 'referee_nation_name' находился в таблице' referee' не в таблице 'game'. Обновлен мой ответ. FYI, всегда полезно, если вы разместите DDL для создания своих объектов и некоторых выборочных данных, чтобы мы могли проверить наши ответы. –

Смежные вопросы