У меня возникли проблемы с написанием триггера базы данных для 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, соответствующие bas_id.
Проблема немного сложнее, чем это, но это основа проблемы, и я новичок в триггерах базы данных и не могу показаться близким. Таблицы довольно большие, поэтому триггер должен быть "целевым". Другими словами, он не должен сканировать всю таблицу A при каждом обновлении и обновлять все записи в таблице B соответственно. Он должен обновлять записи в таблице B, которые непосредственно соответствуют одной обновленной строке, которая запускает триггер.
Любая помощь будет оценена.
################### 33 ОБНОВЛЕНИЕЭто триггер, который в настоящее время стоит, но он не компилируется. Ошибка: "статус неизвестного столбца" в "NEW"
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 ;
Это довольно просто, если я понимаю вас правильно. Тело триггера должно быть похоже на это:
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 из другого значения (также предотвращает ненужные запросы), вы должны изменить, если инструкция:
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 добавляют значительную потерю производительности, даже если вы делаете что-то очень простое внутри. Если эта таблица часто не обновляется, то это не имеет значения.
if statement
гарантирует, что он будет выполнять запрос на обновление только в этом условии.