Giả sử cấu trúc bảng như sau:
use test;
create table song(
song_id integer,
rating_avg double,
rating_sum integer,
rating_count integer);
create table rating(
song_id integer,
user_id integer,
rating integer);
Xác định các trình kích hoạt sau:
delimiter $$
create trigger bi_song before insert on test.song
for each row
begin
set NEW.rating_sum = 0;
set NEW.rating_count = 0;
set NEW.rating_avg = NULL;
end
$$
create trigger ai_rating after insert on test.rating
for each row
begin
update song set
rating_sum = rating_sum + NEW.rating,
rating_count = rating_count + 1,
rating_avg = rating_sum / rating_count
where song_id = NEW.song_id;
end
$$
delimiter ;
Và nó sẽ hoạt động như thế này:
mysql> insert into song(song_id) values (1);
Query OK, 1 row affected (0.06 sec)
mysql> select * from song;
+---------+------------+------------+--------------+
| song_id | rating_avg | rating_sum | rating_count |
+---------+------------+------------+--------------+
| 1 | NULL | 0 | 0 |
+---------+------------+------------+--------------+
1 row in set (0.00 sec)
mysql> insert into rating(song_id, user_id, rating) values (1, 1000, 5);
Query OK, 1 row affected (0.05 sec)
mysql> select * from song;
+---------+------------+------------+--------------+
| song_id | rating_avg | rating_sum | rating_count |
+---------+------------+------------+--------------+
| 1 | 5 | 5 | 1 |
+---------+------------+------------+--------------+
1 row in set (0.00 sec)
mysql> insert into rating(song_id, user_id, rating) values (1, 1001, 7);
Query OK, 1 row affected (0.05 sec)
mysql> select * from song;
+---------+------------+------------+--------------+
| song_id | rating_avg | rating_sum | rating_count |
+---------+------------+------------+--------------+
| 1 | 6 | 12 | 2 |
+---------+------------+------------+--------------+
1 row in set (0.00 sec)
Điều này rất đơn giản, chỉ để minh họa cách làm việc với trình kích hoạt. Trong một ứng dụng thực, bạn sẽ có nhiều cột, chỉ mục hơn, v.v.