MySQL/MariaDB — После вставки, удалить строку, соответствующую указанным условиям триггер

#mysql #triggers #mariadb

#mysql #триггеры #mariadb

Вопрос:

У меня есть таблица аудита, в которой хранится информация, относящаяся к промежуточной таблице, используемой для процесса ETL. У меня есть триггер в родительской таблице, который хранит действия о том, что было выполнено для определенной строки в таблице аудита.

 CREATE TABLE `audit_table` (
  `RowID` bigint(20) NOT NULL,
  `apptid` bigint(20) NOT NULL,
  `modified` bigint(20) NOT NULL,
  `type` varchar(36) COLLATE utf8mb4_unicode_ci NOT NULL,
  `data_push_id` bigint(20) NOT NULL,
  PRIMARY KEY (`RowID`,`apptid`,`type`,`data_push_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
  
  • RowID — PK из родительской таблицы; это значение PK в основной таблице
    равно AUTO_INCREMENT
  • apptid — PK в родительской таблице
  • изменено — временная метка Unix, указывающая, когда строка была изменена в последний раз
  • тип — действие, которое было выполнено; может быть ‘Вставить’ или ‘Удалить’
  • data_push_id — относится к столбцу в родительской таблице, который содержит идентификатор пакета, когда данные были в последний раз загружены в родительскую таблицу. Таким образом, data_push_id 1 может ссылаться на определенный набор записей в родительской таблице, data_push_id 2 может ссылаться на другой набор записей и так далее.

Что я хочу сделать, так это:

  • После вставки записи «удалить» в таблицу аудита…
  • Если есть запись «insert» с тем же номером строки…
  • Вставьте строку «удалить»…
  • И сразу после этого удалите строки «вставить» и «удалить» для этого номера строки.

Это моя первая попытка, но она возвращает ошибку:

 CREATE TRIGGER IF NOT EXISTS `test` AFTER Insert ON 
        `audit_table` FOR EACH ROW
        IF (OLD.`rowid` = NEW.`rowid` AND NEW.`type` = 'Delete' AND OLD.`type` = 'Insert')
        DELETE FROM `audit_table` duap_audit WHERE duap_audit.rowid = OLD.rowid 

SQL Error [1363] [HY000]: (conn=18464) There is no OLD row in on INSERT trigger
  

Что я делаю не так?

Ответ №1:

Только ДО или ПОСЛЕ ОБНОВЛЕНИЯ ИЛИ DELTE ТРИГГЕР имеет старую строку

ТРИГГЕР ВСТАВКИ имеет только НОВУЮ строку, что понятно, у них нет старых значений для замены

В триггере ВСТАВКИ можно использовать только NEW.col_name; старой строки нет. В триггере УДАЛЕНИЯ можно использовать только OLD.col_name; новой строки нет. В триггере ОБНОВЛЕНИЯ вы можете использовать OLD.col_name для ссылки на столбцы строки до ее обновления и NEW.col_name для ссылки на столбцы строки после ее обновления.

см . Руководство