MySQL Fire Trigger для вставки и обновления

Можно ли запустить триггер mysql для событий вставки и обновления таблицы?

Я знаю, что могу сделать следующее

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW
BEGIN
.....
END //

CREATE TRIGGER my_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....
END //

Но как я могу сделать

CREATE TRIGGER my_trigger
    AFTER INSERT ON `table` AND
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
.....

Возможно ли, или мне нужно использовать 2 триггера? Код тот же для обоих, и я не хочу его повторять.

Ответ 1

Вам нужно создать два триггера, но вы можете переместить общий код в процедуру и попросить их вызвать процедуру.

Ответ 2

В ответ на запрос @Zxaos, поскольку у нас не могут быть операторы AND/OR для триггеров MySQL, начиная с вашего кода, ниже приведен полный пример для достижения того же.

1. Определите триггер INSERT:

DELIMITER //
DROP TRIGGER IF EXISTS my_insert_trigger//
CREATE [email protected] TRIGGER my_insert_trigger
    AFTER INSERT ON `table`
    FOR EACH ROW

BEGIN
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    -- NEW.id is an example parameter passed to the procedure but is not required
    -- if you do not need to pass anything to your procedure.
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

2. Определите триггер UPDATE

DELIMITER //
DROP TRIGGER IF EXISTS my_update_trigger//

CREATE [email protected] TRIGGER my_update_trigger
    AFTER UPDATE ON `table`
    FOR EACH ROW
BEGIN
    -- Call the common procedure ran if there is an INSERT or UPDATE on `table`
    CALL procedure_to_run_processes_due_to_changes_on_table(NEW.id);
END//
DELIMITER ;

3. Определите общую ПРОЦЕДУРУ, используемую этими триггерами:

DELIMITER //
DROP PROCEDURE IF EXISTS procedure_to_run_processes_due_to_changes_on_table//

CREATE [email protected] PROCEDURE procedure_to_run_processes_due_to_changes_on_table(IN table_row_id VARCHAR(255))
READS SQL DATA
BEGIN

    -- Write your MySQL code to perform when a `table` row is inserted or updated here

END//
DELIMITER ;

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

Ответ 3

К сожалению, мы не можем использовать в MySQL после описания INSERT или UPDATE, например, в Oracle