sql >> Database >  >> RDS >> Mysql

Trigger om rij in een andere tabel bij te werken

Uitgaande van een tabelstructuur zoals deze:

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);

Definieer de volgende triggers:

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 ;

En het zou als volgt moeten werken:

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)

Dit is erg vereenvoudigd, alleen om te illustreren hoe je met triggers werkt. In een echte applicatie zou je meer kolommen, indexen, enz. hebben.




  1. Uitzondering door gebruiker definiëren definiëren met PRAGMA EXCEPTION_INIT

  2. Kan InnoDB een stopwoordbestand gebruiken?

  3. CSV in SQL-ontwikkelaar…

  4. Hoe Blob-gegevens in MYSQL naar Android ImageView te converteren