MySQLトリガの概要


備考:テストデータベースバージョンはMySQL 8.0
このブログではMySQLトリガについてお話しします.トリガは、テーブル内のデータが変更されたときに自動的に実行される特殊なストレージ・プロシージャです.ストレージ・プロシージャは手動で呼び出され、トリガは自動的です.もちろん、頻繁に更新されたり、データ量が大きいテーブルでは、トリガを慎重に使用すると、ある程度パフォーマンスに影響します.
一.構文関連
トリガ構文:
CREATE
    [DEFINER = user]
    TRIGGER trigger_name
    trigger_time trigger_event
    ON tbl_name FOR EACH ROW
    [trigger_order]
    trigger_body

trigger_time: { BEFORE | AFTER }

trigger_event: { INSERT | UPDATE | DELETE }

trigger_order: { FOLLOWS | PRECEDES } other_trigger_name

BEFORE–トリガ時間の前にAFTERを実行–トリガ時間の後に操作を実行
FOR EACH ROW–操作の影響を受ける行ごとにトリガが実行されます
NEW-NEWなどの新しいレコードをマークします.IDはテーブル内の新しいデータ行のID OLDを表す–古いレコード、例えばOLDをマークする.IDテーブル内の旧データ行を示すID
二.ケース関連
需要:ユーザー・テーブルに対して、削除したデータは、履歴データを履歴テーブルに保持します.
テストデータ:
create table user_info(id int not null auto_increment,name varchar(200),id_number varchar(50),primary key(id));
insert into user_info values (1,'  ','420123199001011234');
insert into user_info values (2,'  ','420123199001011235');
insert into user_info values (3,'  ','420123199001011236');

--        
create table user_info_history(id int not null auto_increment,type varchar(50),user_id int,name varchar(200),id_number varchar(50),primary key(id));

トリガコード:
delimiter //

create trigger trg_del_userinfo before delete on user_info
  for each row
begin
  
  insert into user_info_history(user_id,name,id_number,create_time)
  select old.id,old.name,old.id_number,now();

end;

//

delimiter ;

実行結果:
mysql> delimiter //
mysql>
mysql> create trigger trg_del_userinfo before delete on user_info
    ->   for each row
    -> begin
    ->
    ->   insert into user_info_history(user_id,name,id_number,create_time)
    ->   select old.id,old.name,old.id_number,now();
    ->
    -> end;
    ->
    -> //
Query OK, 0 rows affected (0.01 sec)

mysql>
mysql> delimiter ;
mysql>
mysql>
mysql> select * from user_info;
+----+--------+--------------------+
| id | name   | id_number          |
+----+--------+--------------------+
|  1 |      | 420123199001011234 |
|  2 |      | 420123199001011235 |
|  3 |      | 420123199001011236 |
+----+--------+--------------------+
3 rows in set (0.00 sec)

mysql> select * from user_info_history;
Empty set (0.00 sec)

--       
mysql> delete from user_info where id = 1;
Query OK, 1 row affected (0.00 sec)
--   user_info ,       
mysql> select * from user_info;
+----+--------+--------------------+
| id | name   | id_number          |
+----+--------+--------------------+
|  2 |      | 420123199001011235 |
|  3 |      | 420123199001011236 |
+----+--------+--------------------+
2 rows in set (0.00 sec)
--      ,         ,         ,      
mysql> select * from user_info_history;
+----+------+---------+--------+--------------------+---------------------+
| id | type | user_id | name   | id_number          | create_time         |
+----+------+---------+--------+--------------------+---------------------+
|  1 | NULL |       1 |      | 420123199001011234 | 2020-05-25 22:26:54 |
+----+------+---------+--------+--------------------+---------------------+
1 row in set (0.00 sec)

mysql>