MySQL触发太多次触发

时间:2011-05-04 14:31:17

标签: mysql sql triggers

我在mysql中有一个视图,它由三个联合在一起的表组成:

CREATE VIEW program_operator_jct_view AS
select
        program_id, 
        operator_code,
        'PROGRAM_OPERATOR' AS type
    from 
        program_operator_jct
UNION
    (select 
        program_id, 
        operator_code,
        'PROGRAM_GROUP' AS type
    from 
        program_operator_group_jct pg_jct,
        operator_group_jct og_jct
    where
        pg_jct.group_id = og_jct.group_id)

从这个视图中,我创建了一个提高性能的摘要表,该表被编入索引,因此我可以通过覆盖索引返回此摘要表的结果:

CREATE TABLE `program_operator_jct_summary` (
  `program_id` int(7) NOT NULL,
  `operator_code` varchar(6) NOT NULL,
  PRIMARY KEY (`program_id`,`operator_code`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1


//BUILD SUMMARY PROCEDURE
delimiter //
CREATE PROCEDURE update_program_operator_jct_summary ()
BEGIN
DELETE FROM program_operator_jct_summary;
INSERT INTO program_operator_jct_summary select DISTINCT program_id, operator_code from program_operator_jct_view;
INSERT INTO trigger_record (name) VALUES ('update_program_operator_jct_summary');
END
//

我将此过程附加到构成摘要表的下划线表的插入,更新和删除触发器:

-program_operator_jct

-program_operator_group_jct

-operator_group_jct

实施例

delimiter //
CREATE TRIGGER trigger_program_operator_jct_insert AFTER INSERT ON program_operator_jct
FOR EACH ROW 
BEGIN
CALL update_program_operator_jct_summary ();
END
//

当我将(5)运算符添加到program_operator_jct:

时,这是我的问题
INSERT INTO program_operator_jct (program_id, operator_code) VALUES 
('112', '000500'), 
('112', '000432'), 
('112', '000501'), 
('112', '000264'), 
('112', '000184')

此触发器运行(5)次,如果我添加100个运算符,则此触发器运行100次。这是一个使用触发器的好地方,因为我不必担心摘要表与下划线表过时。

然而,为扩展插入中的每个值重建一个摘要表是一个太大的性能损失(有时我一次向程序添加数百个运算符)。我希望在下划线表上执行扩展插入后,触发器运行一次。这可能吗?

1 个答案:

答案 0 :(得分:4)

触发器正在完成其工作,例如'为了每一行'。

我不相信mysql会让你选择在最后运行一次触发器。

在INSERT成功完成后,我将从您的代码中调用存储过程。

如果你担心遗忘,请设置一个cron作业,偶尔运行一次。

祝你好运。