Триггер базы данных - когда поле в обновленной строке равно одному из трех значений, обновите другую таблицу - PullRequest
0 голосов
/ 22 сентября 2018

У меня проблемы с записью триггера базы данных для 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, которые непосредственно соответствуют единственной обновленной строке, которая запускает триггер.

Любая помощь будет принята с благодарностью.

################### 33 UPDATE

Это триггер в том виде, в каком он есть в данный момент, но не компилируется.Ошибка «неизвестный столбец« статус »в« 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 ;

1 Ответ

0 голосов
/ 22 сентября 2018

Это довольно просто, если я правильно вас понял.Тело триггера должно быть примерно таким:

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 добавляют значительную потерю производительности, даже если вы делаете что-то очень простое внутри.Если эта таблица не обновляется часто, это не имеет значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...