2016-05-29 7 views
0

У меня есть две таблицы, которые выглядят так (конечно, у них гораздо больше строк).Как создать этот триггер?

AuthorID | Name   | Number of albums 
------------------------------------------- 
1  | Santana  | 39 
2  | Johnny Cash | 95 

AuthorID | AlbumID  
---------------------- 
1  | 14  
2  | 17 

Что я хочу сделать, это иметь триггер, который обновляется, когда строка удаляется или вставлена ​​во вторую таблицу. Строка, которую я хочу обновить в первой таблице, - это третья строка. Что в основном представляет count(AlbumID), что также я подсчитал. Я действительно не знаю, как бы это сделать, так как до сих пор я создал только простые триггеры.

+0

И почему бы не рассчитать это значение при выборе при необходимости? –

+0

@juergend хочет, чтобы таблицы были актуальными и не обновляли их вручную, так как строки также будут удалены и автоматически загружены программой – Johny

+0

Но зачем хранить значение вообще? Если вам нужен счет, тогда просто вычислите его «на лету» в запросе 'select'. –

ответ

0

Не совсем понятно, почему вам нужно хранить столбец number_of_albums в первую очередь. Но я не буду решать этот вопрос. Я отвечу на вопрос, который вы задали.

После запуска триггера вставки во второй таблице можно выполнить обновление первой таблицы, чтобы увеличить столбец number_of_albums для данного author_id. Предположим, что имя первой таблицы - author, а имя второй таблицы - album.

DELIMITER $$ 

CREATE TRIGGER album_ai 
AFTER INSERT ON album 
FOR EACH ROW 
BEGIN 
    UPDATE author 
     SET number_of_albums = number_of_albums + 1 
    WHERE author_id = NEW.author_id; 
END$$  

DELIMITER ; 

Вы могли бы сделать что-то подобное с триггером после удаления, декрементом number_of_albums колонки, ссылающийся OLD.author_id получить значение author_id столбца строки, удаляются.

Для обновления, если значение столбца author_id было изменено, вам необходимо обновить две строки ... increment number_of_albums в одной строке и уменьшить число_значений другого.

DELIMITER $$ 

CREATE TRIGGER album_ai 
AFTER UPDATE ON album 
FOR EACH ROW 
BEGIN 
    IF NOT (NEW.author_id <=> OLD.author_id) THEN 
    UPDATE author 
     SET number_of_albums = number_of_albums - 1 
     WHERE author_id = OLD.author_id; 
    UPDATE author 
     SET number_of_albums = number_of_albums + 1 
     WHERE author_id = NEW.author_id; 
    END IF; 
END$$  

DELIMITER ; 
+0

делает mysql undersatand upsert в триггере? – splash58

+0

MySQL поддерживает триггеры как до, так и после обоих INSERT и UPDATE. MySQL не поддерживает «upsert», кроме инструкции 'INSERT ... ON DUPLICATE KEY UPDATE'. И MySQL будет вызывать соответствующие триггеры INSERT и/или UPDATE. – spencer7593

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