У меня проблемы с написанием триггера базы данных для mysql. Для простоты я сделаю макет поддельной схемы, а затем расскажу, что должен делать триггер:

Table A
id
status
base_id

Table B
id
status
A.base_id (foriegn key back to base_id)

При обновлении записи в таблице A, если для статуса установлено одно из трех значений (4,5,6), триггеру необходимо обновить все записи в таблице B, соответствующие base_id.

Проблема немного сложнее, чем эта, но это основа проблемы, и я новичок в триггерах базы данных и, кажется, даже близко не могу подойти. Таблицы довольно большие, поэтому триггер должен быть «целевым». Другими словами, он не должен сканировать всю таблицу A каждый раз, когда происходит какое-либо обновление, и соответственно обновлять все записи в таблице B. Он должен обновлять только те записи в таблице B, которые непосредственно соответствуют одной обновленной строке, которая запускает триггер.

Любая помощь будет оценена.

Это триггер в его нынешнем виде, но он не компилируется. Ошибка "неизвестный столбец" статус "в" НОВОМ "".

DELIMITER $$
CREATE TRIGGER db.after_tableA_update
AFTER UPDATE ON tableA
FOR EACH ROW

BEGIN

IF NEW.status IN (13,14,15) then
     update tableB as b set b.task_status = 26 where b.match_id = NEW.match_id;
END IF;
END $$
DELIMITER ;
0
Mark C. 22 Сен 2018 в 18:13

1 ответ

Лучший ответ

Это довольно просто, если я правильно понимаю. Корпус спускового крючка должен быть похож на этот:

BEGIN
IF NEW.status IN(4,5,6) THEN
   UPDATE table_B SET status = NEW.status WHERE base_id = NEW.base_id;
END IF;
END

Но если вы хотите обновлять только тогда, когда статус установлен на 4,5,6 с другого значения (также предотвращает ненужные запросы), вы должны изменить оператор if на это:

BEGIN
IF NEW.status IN(4,5,6) AND OLD.status <=> NEW.status THEN
   UPDATE table_B SET status = NEW.status WHERE base_id = NEW.base_id;
END IF;
END

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

ПРИМЕЧАНИЕ. Если у вас есть возможность сделать это в коде приложения, вам следует избегать использования триггеров. Триггеры в mysql добавляют значительную потерю производительности, даже если вы делаете что-то очень простое внутри. Если эта таблица не обновляется часто, то это не имеет значения.

1
abeyaz 22 Сен 2018 в 15:39