【问题标题】:MySQL triggers fires too many timesMySQL 触发器触发次数过多
【发布时间】:2011-05-04 14:31:17
【问题描述】:

我在 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 次。这是使用触发器的好地方,因为我不必担心汇总表与下划线表过时。

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

【问题讨论】:

    标签: mysql sql triggers


    【解决方案1】:

    触发器正在完成它的工作,例如'每一行'。

    我不相信 mysql 让您可以选择在最后运行一次触发器。

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

    如果您担心忘记,请设置一个 cron 作业以每隔一段时间运行一次。

    祝你好运。

    【讨论】:

    • 感谢您的时间阿兰。
    • 来自 mysql 5.5 常见问题解答:B.5.3: Does MySQL 5.5 have statement-level or row-level triggers? In MySQL 5.5, all triggers are FOR EACH ROW—that is, the trigger is activated for each row that is inserted, updated, or deleted. MySQL 5.5 does not support triggers using FOR EACH STATEMENT.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-09
    • 2018-05-16
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2011-05-11
    • 2019-08-07
    相关资源
    最近更新 更多