MySQL: как передать параметр в триггер - PullRequest
0 голосов
/ 17 февраля 2019

У меня есть таблица на mysql 5.7 дБ, содержащая, скажем, спортсменов с их средним, максимальным и средним временем в конкретном виде спорта.У меня есть еще одна таблица, в которой перечислены некоторые вычисленные статистические данные, основанные на этих значениях.

Мне удалось выполнить вычисления, которые заканчиваются на втором с использованием хранимых процедур.Я использую в качестве входного параметра для хранимой процедуры имя спортсмена.

Поэтому, когда в первую таблицу вставляется спортсмен (с его / ее средним / минимальным / максимальным временем) или его / ее значения обновляются иЯ запускаю хранимую процедуру, позже обновляет таблицу статистика .

Мой вопрос: как добиться того же результата с помощью триггеров ?

Iдумаю, выполнимо / легко обновить всю таблицу при каждой вставке или обновлении первой таблицы.Что было бы более эффективным с точки зрения производительности, было бы на каждом:

INSERT into table1 values (..) where athlete_name="John Do"

(...)

ON DUPLICATE KEY UPDATE (...)

Запустите триггер в форме псевдокода:

INSERT into statistics_table values (..) where athlete_name="John Do"

ON DUPLICATE KEY UPDATE (...)

Как можно передать athlete_name="John Do" втриггер динамически, чтобы избежать обновления всей таблицы статистики?

Ответы [ 2 ]

0 голосов
/ 17 февраля 2019

Вы можете создавать триггеры, которые срабатывают после каждой вставки или обновления в родительской таблице (спортсмены).В каждом триггере вы можете получить доступ к значению столбца athlete_name в записи, которая только что была создана или изменена, а затем вызвать вашу хранимую процедуру, используя CALL().

Вот пример кода для такого INSERTтриггер:

CREATE TRIGGER athletes_upd AFTER INSERT ON athletes 
FOR EACH ROW
BEGIN
    CALL my_procedure(NEW.athlete_name);
END;

UPDATE триггер:

CREATE TRIGGER athletes_upd AFTER UPDATE ON athletes 
FOR EACH ROW
BEGIN
    CALL my_procedure(NEW.athlete_name);  -- or maybe OLD.athlete_name ?
END;
0 голосов
/ 17 февраля 2019

Вы не можете передавать никакие параметры в триггер, и оператор insert также не поддерживает предложение where.

Сказав это, триггер может забрать пользователяимя из вставляемой / обновляемой / удаляемой записи, используя NEW.athlete_name или OLD.athlete_name (в зависимости от того, что требуется) и используйте его для вызова хранимой процедуры:

В теле триггера, OLD и NEWключевые слова позволяют получить доступ к столбцам в строках, затронутых триггером.OLD и NEW являются расширениями MySQL для триггеров;они не чувствительны к регистру.

В триггере INSERT может использоваться только NEW.col_name;нет старого рядаВ триггере DELETE может использоваться только OLD.col_name;нового ряда нетВ триггере UPDATE вы можете использовать OLD.col_name для ссылки на столбцы строки до ее обновления и NEW.col_name для ссылки на столбцы строки после ее обновления.

Столбец с именемСТАРЫЙ только для чтения.Вы можете ссылаться на него (если у вас есть привилегия SELECT), но не можете изменять его.Вы можете ссылаться на столбец с именем NEW, если у вас есть привилегия SELECT для него.В триггере BEFORE вы также можете изменить его значение с помощью SET NEW.col_name = value, если у вас есть привилегия UPDATE для него.Это означает, что вы можете использовать триггер для изменения значений, которые будут вставлены в новую строку или использованы для обновления строки.(Такой оператор SET не влияет на триггер AFTER, поскольку изменение строки уже произошло.)

...