2011-05-04 2 views
1

J'ai vue dans une base MySQL qui est fait de trois tables filles fusionnées ensemble:MySQL déclenche des incendies trop de fois

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) 

De ce point de vue, je crée un tableau récapitulatif des performances accrues, qui est indexé si mes résultats à partir de ce tableau récapitulatif peut être retourné par index couvrant:

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 
// 

Je cette procédure pour attachais l'insertion, la mise à jour et supprimer les déclencheurs des tables qui composent soulignant le tableau récapitulatif:

-program_operator_jct

-program_operator_group_jct

-operator_group_jct

Exemple:

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 
// 

Voilà mon problème quand j'ajoute (5) les opérateurs à la program_operator_jct:

INSERT INTO program_operator_jct (program_id, operator_code) VALUES 
('112', '000500'), 
('112', '000432'), 
('112', '000501'), 
('112', '000264'), 
('112', '000184') 

Ce déclencheur s'exécute (5) fois, si j'ajoute 100 opérateurs ce déclencheur s'exécute 100 fois. C'est un bon endroit pour utiliser les déclencheurs car je n'ai pas à m'inquiéter du fait que la table récapitulative soit obsolète avec les tables de soulignement.

reconstruction Toutefois, un tableau récapitulatif pour chaque valeur dans un Insertions étendues est beaucoup trop d'un coup de performance (parfois ajouter des centaines d'opérateurs à des programmes à la fois). Je veux que le déclencheur s'exécute une fois que les insertions étendues sont effectuées sur les tables de soulignement. Est-ce possible?

Répondre

4

La gâchette est en train de faire son travail, par exemple, 'POUR CHAQUE RANG'.

Je ne crois pas que MySQL vous donne la possibilité d'exécuter un déclencheur, une fois à la fin.

j'appelle la procédure stockée à partir de votre code après l'insertion a terminé avec succès.

Si vous êtes inquiet d'oublier, la configuration d'une tâche cron pour exécuter chaque fois dans un certain temps.

Bonne chance.

+0

Merci pour votre temps Alain. –

+0

A partir de la FAQ mysql 5.5: 'B.5.3: MySQL 5.5 a-t-il des triggers au niveau des instructions ou des lignes? Dans MySQL 5.5, tous les déclencheurs sont FOR EACH ROW, c'est-à-dire que le trigger est activé pour chaque ligne insérée, mise à jour ou supprimée. MySQL 5.5 ne supporte pas les déclencheurs utilisant FOR EACH STATEMENT. – Johan