Использование операторов IF в триггере MySQL для вставки нескольких строк - PullRequest
2 голосов
/ 24 апреля 2009

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

23/04/09 22:47 Джеймс Смит изменил имя арендатора с «Джордж Хилл» на «Джордж Хиллинг».

Триггер у меня выглядит примерно так - это сокращенная версия.

Два вопроса:

A) Это довольно дорого с точки зрения производительности, и если да, то есть ли лучший подход? Б) Есть ли более аккуратный способ сделать это без всех IF, используя какой-то цикл, возможно?

DELIMITER //
CREATE TRIGGER repair_history AFTER UPDATE ON repairs
FOR EACH ROW
BEGIN
INSERT INTO repair_edit SET repair_id=NEW.repair_id,
edit_date_time=NEW.edit_date_time, edited_by=NEW.edited_by;

IF OLD.tenant_name != NEW.tenant_name THEN
INSERT INTO repair_history SET edit_id=LAST_INSERT_ID(), field='tenant_name',
former_field_value=OLD.tenant_name, new_field_value=NEW.tenant_name;
END IF;

IF OLD.priority != NEW.priority THEN
INSERT INTO repair_history SET edit_id=LAST_INSERT_ID(), field='priority',
former_field_value=OLD.priority, new_field_value=NEW.priority;
END IF;

IF OLD.property_id != NEW.property_id THEN
INSERT INTO repair_history SET edit_id=LAST_INSERT_ID(), field='property_id',
former_field_value=OLD.property_id, new_field_value=NEW.property_id;
END IF;

IF OLD.type_id != NEW.type_id THEN
INSERT INTO repair_history SET edit_id=LAST_INSERT_ID(), field='type_id',
former_field_value=OLD.type_id, new_field_value=NEW.type_id;
END IF;

END; //
DELIMITER ;

Ответы [ 2 ]

0 голосов
/ 24 апреля 2009

A) Это довольно дорого с точки зрения производительности

Профиль. Только вы знаете, какое оборудование вы используете, и какой объем обновлений должна обрабатывать ваша база данных.

и если да, то есть ли лучший подход?

Подумайте, что требует времени в вашем спусковом крючке. Это сравнения или вставки?

B) Есть ли более аккуратный способ сделать это без всех IF, возможно, используя какой-то цикл?

К сожалению, я не знаю способа индексации в столбцах псевдотаблиц NEW и OLD

0 голосов
/ 24 апреля 2009

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

http://forums.mysql.com/read.php?99,174963,175381#msg-175381

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