MySQLトリガの概要
備考:テストデータベースバージョンはMySQL 8.0
このブログではMySQLトリガについてお話しします.トリガは、テーブル内のデータが変更されたときに自動的に実行される特殊なストレージ・プロシージャです.ストレージ・プロシージャは手動で呼び出され、トリガは自動的です.もちろん、頻繁に更新されたり、データ量が大きいテーブルでは、トリガを慎重に使用すると、ある程度パフォーマンスに影響します.
一.構文関連
トリガ構文:
BEFORE–トリガ時間の前にAFTERを実行–トリガ時間の後に操作を実行
FOR EACH ROW–操作の影響を受ける行ごとにトリガが実行されます
NEW-NEWなどの新しいレコードをマークします.IDはテーブル内の新しいデータ行のID OLDを表す–古いレコード、例えばOLDをマークする.IDテーブル内の旧データ行を示すID
二.ケース関連
需要:ユーザー・テーブルに対して、削除したデータは、履歴データを履歴テーブルに保持します.
テストデータ:
トリガコード:
実行結果:
このブログでは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>