Référez vous à la doc mysql qui est très facile à suivre. Mais peut être qu'un exemple simple pourrait aider à forger des applications des triggers.
Supposons qu'une table contienne les logs des courses d'un taxi : no de coureur, distance parcourue, durée du parcours
CREATE TABLE `logstaxis` (
`nocourse` int(11) NOT NULL,
`distance` double NOT NULL DEFAULT '0',
`duree` double NOT NULL DEFAULT '1'
) ;
ALTER TABLE `logstaxis` ADD PRIMARY KEY (`nocourse`);
et qu'il faille classer les résultats par vitesse c'est à dire faire
select * from `logstaxis` order by `distance`/`duree` limit 0,20 ; // where `duree`>0 et limit optionnels mais conseillés ; ajouter l'index duree
Là, mysql ne sait pas classer les lignes sans calculer les rapports et les classer. Il n'y a pas d'index qui puisse s'exprimer par un rapport.
S'il n'y a que 100 ou 200 lignes ce n'est pas grave mais ça commence à compter au delà.
Solution parfois possible : les triggers.
Avec on peut ajouter et maintenir cette colonne sans changer le code des pages
D'abord ajoutons une colonne vitesse et faisons en un index :
ALTER TABLE `logstaxis` ADD `vitesse` REAL NOT NULL DEFAULT '0.0' AFTER `duree`, ADD INDEX (`vitesse`);
Ensuite, créons 2 triggers qui vont calculer la vitesse de chaque ligne insérée ou modifiée :
DROP TRIGGER IF EXISTS `sum12insert`;
CREATE TRIGGER `sum12insert` BEFORE INSERT ON `table` FOR EACH ROW SET NEW.`vitesse`=NEW.`dist`/NEW.`duree` ;
DROP TRIGGER IF EXISTS `sum12update`;
CREATE TRIGGER `sum12update` BEFORE UPDATE ON `table` FOR EACH ROW SET NEW.`vitesse`=NEW.`dist`/NEW.`duree` ;
Maintenant, nous pouvons écrire
select * from `logstaxis` order by `vitesse` limit 0,20 ; // where et limit optionnels mais conseillés
et espérer à la fois un résultat juste et des performances de l'index.
Phpmyadmin peut aider à saisir les triggers et voir les effets après insertions et modifs.
Quand le truc est compris, il faut revenir à la doc pour voir tout ce qu'il est possible de faire et trouver des applications en optimisation.