Внутри триггера вы не можете изменить таблицу, к которой принадлежит триггер.
Вы также не можете что-то косвенно изменить эту таблицу.
Однако есть несколько других вещей, которые вы можете сделать. Если вы не удаляете строку, а добавляете поле deleted
, тогда вы можете пометить как удаленное, вот так.
delimiter $$
drop trigger w_leb_go $$
CREATE TRIGGER w_leb_go BEFORE UPDATE ON test FOR EACH ROW
BEGIN
IF NEW.res=3 THEN
SET NEW.deleted = 1;
END IF;
END$$
delimiter ;
Обратите внимание, что триггер должен быть before
, если вы хотите изменить что-либо в строке.
В качестве альтернативы вы можете добавить напоминание об удалении во временную таблицу и проверить эту таблицу после оператора обновления.
CREATE TRIGGER au_test_each AFTER UPDATE ON test FOR EACH ROW
BEGIN
IF NEW.res=3 THEN
INSERT INTO deletion_list_for_table_test (test_id) VALUE (NEW.id);
END IF;
END$$
Теперь вам нужно изменить оператор обновления на:
START TRANSACTION;
UPDATE test SET whatever to whichever;
DELETE test FROM test
INNER JOIN deletion_list_for_table_test dt ON (test.id = dt.test_id);
DELETE FROM deletion_list_for_table_test WHERE test_id > 0 /*i.e. everything*/
COMMIT;
Конечно, если вы отметите строк, вы можете упростить код удаления до:
START TRANSACTION;
UPDATE test SET whatever to whichever;
DELETE FROM test WHERE deleted = 1;
COMMIT;