При выполнении REPLACE в Mysql фактически делается два действия - удаление строки, если она существует по уникальному ключу, и вставка новой. Соответственно, независимо друг от друга вызываются два триггера After Delete и After Insert.
Существует ли какая-либо возможность отличить внутри процедуры триггера, что он вызван операцией Replace и для него существует "коллега", который уже был или будет вызван? Или хотя бы отличить вызов триггера таким образом от вызовов операциями INSERT и DELETE?
Вы не можете внутри тела триггера определить, какой инструкций он был вызван - INSERT или REPLACE. Можно попробовать внутри тела триггера записывать флаги в сессионные переменные:
CREATE TRIGGER after_delete AFTER delete on table FOR EACH ROW BEGIN
SET @deleteTriggerExecuted = 1;
END;
CREATE TRIGGER after_insert AFTER INSERT on class FOR EACH ROW BEGIN
IF @deleteTriggerExecuted = 1 THEN
-- триггер after_delete был вызван
END IF;
END;