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

0

У меня возникли проблемы с написанием триггера базы данных для 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 ;
Теги:
triggers

1 ответ

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 из другого значения (также предотвращает ненужные запросы), вы должны изменить, если инструкция:

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

  • 0
    В MYSQL 'NEW' указывает на запись, которая специально сработала? (Извините, больше программиста промежуточного программного обеспечения, чем dba). Просто чтобы прояснить, я не хочу сканировать всю базу данных для всех записей, которые = = 4,5,6 и делать вещи со всеми ними. Я просто хочу сосредоточиться на обновленной записи, и если она равна 4,5,6 ... я хочу сделать что-то для другой таблицы
  • 0
    Это именно то, что делает триггер. Триггер выполняется для каждой записи в MySQL, и if statement гарантирует, что он будет выполнять запрос на обновление только в этом условии.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню