2009-04-23 111 views
2

我有一个触发器,用于存储用户编辑数据时在单独的表中进行的更改。这些数据以当前数据以可读的格式写在当前数据下面,即在MySQL触发器中使用IF语句插入多行

23/04/09 22:47詹姆斯史密斯将租户名称从“George Hill”改为“George Hilling”。

我看起来有点像这样的触发器 - (这是删节版本)。

两个问题:

A)这是相当昂贵的性能代价,如果是有没有更好的方法来取? B)有没有更干净的方法来做到这一点,没有所有的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 ; 

回答

0

A)这是相当昂贵的性能代价

简介它。只有你知道你使用的是什么硬件,以及你的数据库需要处理多少更新。

如果是的话还有更好的方法吗?

想想你的触发器中最糟糕的时间是什么。这是比较还是插入?

B)有没有更干净的方法来做到这一点,没有所有的IF,使用某种循环或许?

不幸的是,我不知道的方式来索引到的伪表NEW和OLD

0

为什么不在每个可以更新和检查的列上放置触发器。尽管如此,这将会带来性能。你可能想要做的是做一个单元测试,在你有触发器的地方没有它,并且看看你在快速改变许多行时有什么不同。

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

+0

MySQL已经列触发列? – tpdi 2009-04-23 22:25:39