MySQLケースコンバット--MySQLトリガー

序文

この環境は、
特定の構築のためにMySQL-5.7.14を構築するためのCentos7.8システムに基づいています。MySQL-5.7.14環境構築を参照してください。

多くの場合、テーブルが接続され、同じ文字列のステートメントが書き込まれるたびに、empテーブルとdeptテーブルで結合クエリを実行する必要があります。同時に、給与キューデータの機密性が高いため、外部要件は次のとおりです。表示されません。
このように、ビューを作成することで完了できます


1.トリガーとは

トリガー(トリガー)は特別なストアドプロシージャであり、その実行はプログラムによって呼び出されず、手動で開始されることもありませんが、イベントによってトリガーされます。
テーブルに対して操作(挿入、削除、更新)が実行されると、実行のためにアクティブ化されます。トリガーは、データの整合性制約とビジネスルールを強化するためによく使用されます。

たとえば、学生の情報を学生テーブルに追加する場合、同時に学生の総数を変更する必要があります。したがって、学生テーブルのトリガーを作成し、学生レコードを追加または削除するたびに、学生の総数とレコード数の整合性を確保するために、学生の総数の計算操作が実行されます。

トリガー(引き金)は、特別なストアドプロシージャで、違いは、ストアドプロシージャの実行はCALL文で呼び出す必要があるということである、
トリガーの実行は、以下のように、CALL文で呼び出されるか、手動で開始する必要はありません。限り事前定義されたイベントが発生すると、MySQLによって自動的に呼び出されます
トリガープログラムの利点は次のとおりです。

  • トリガープログラムの実行は自動的に行われます。トリガープログラム関連テーブルのデータに対応する変更を加えた直後に実行されます。
  • トリガーは、データベース内の関連テーブルを介して他のテーブルをカスケードおよび変更できます。
  • トリガープログラムは、FOREIGNKEY制約およびCHECK制約よりも複雑なチェックおよび操作を実装できます。

2.実際のケースをトリガーします

1.学生のための複数のテーブル

情報の同期と新しい(追加、削除)
作成トリガー

学生、student_totalの2つのテーブルを準備します。学生テーブルで
学生情報が追加または削除されると、student_totalの統計も更新されます。

# 创建student
mysql> create table student
    -> (id int unsigned auto_increment primary key,
    -> name varchar(50));
    
# 创建student_total
mysql> create table student_total(total int);

# 两张表中分别插入数据
mysql> insert into student(name) values('z3');
mysql> insert into student_total values(1);

mysql> select * from student;
+----+------+
| id | name |
+----+------+
|  1 | z3   |
+----+------+
1 row in set (0.00 sec)

mysql> select * from student_total;
+-------+
| total |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

# 创建学生信息增加 触发器
mysql> \d $$
mysql> create trigger student_insert after insert
    -> on student for each row
    -> begin
    ->   update student_total set total=total+1;
    -> end$$
mysql> \d ;

# 创建学生信息删除 触发器
mysql>  \d $$
mysql>  create trigger student_delete after delete
    ->  on student for each row
    ->  begin
    ->    update student_total set total=total-1;
    ->  end$$
mysql> \d ;

# 增加学生时
mysql> insert into student(name)
    -> values('l4');
mysql> select * from student;
+----+------+
| id | name |
+----+------+
|  1 | z3   |
|  2 | l4   |
+----+------+
2 rows in set (0.00 sec)

mysql> select * from student_total;
+-------+
| total |
+-------+
|     2 |
+-------+
1 row in set (0.00 sec)

# 删除学生时
mysql> delete from student
    -> where id=1;
mysql> select * from student;
+----+------+
| id | name |
+----+------+
|  2 | l4   |
+----+------+
1 row in set (0.00 sec)

mysql> select * from student_total;
+-------+
| total |
+-------+
|     1 |
+-------+
1 row in set (0.00 sec)

作成されたトリガーを表示する

# 查看创建的触发器
mysql> show triggers\G
*************************** 1. row ***************************
             Trigger: student_insert
               Event: INSERT
               Table: student
           Statement: begin
  update student_total set total=total+1;
end
              Timing: AFTER
             Created: 2021-02-03 15:05:38.49
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
*************************** 2. row ***************************
             Trigger: student_delete
               Event: DELETE
               Table: student
           Statement: begin
   update student_total set total=total-1;
 end
              Timing: AFTER
             Created: 2021-02-03 15:21:11.06
            sql_mode: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
             Definer: root@localhost
character_set_client: utf8
collation_connection: utf8_general_ci
  Database Collation: utf8_general_ci
2 rows in set (0.00 sec)


mysql> select * from information_schema.triggers where TRIGGER_NAME='student_insert' or TRIGGER_NAME='student_delete'\G
*************************** 1. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: db
              TRIGGER_NAME: student_insert
        EVENT_MANIPULATION: INSERT
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: db
        EVENT_OBJECT_TABLE: student
              ACTION_ORDER: 1
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: begin
  update student_total set total=total+1;
end
        ACTION_ORIENTATION: ROW
             ACTION_TIMING: AFTER
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
                   CREATED: 2021-02-03 15:05:38.49
                  SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
                   DEFINER: root@localhost
      CHARACTER_SET_CLIENT: utf8
      COLLATION_CONNECTION: utf8_general_ci
        DATABASE_COLLATION: utf8_general_ci
*************************** 2. row ***************************
           TRIGGER_CATALOG: def
            TRIGGER_SCHEMA: db
              TRIGGER_NAME: student_delete
        EVENT_MANIPULATION: DELETE
      EVENT_OBJECT_CATALOG: def
       EVENT_OBJECT_SCHEMA: db
        EVENT_OBJECT_TABLE: student
              ACTION_ORDER: 1
          ACTION_CONDITION: NULL
          ACTION_STATEMENT: begin
   update student_total set total=total-1;
 end
        ACTION_ORIENTATION: ROW
             ACTION_TIMING: AFTER
ACTION_REFERENCE_OLD_TABLE: NULL
ACTION_REFERENCE_NEW_TABLE: NULL
  ACTION_REFERENCE_OLD_ROW: OLD
  ACTION_REFERENCE_NEW_ROW: NEW
                   CREATED: 2021-02-03 15:21:11.06
                  SQL_MODE: ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
                   DEFINER: root@localhost
      CHARACTER_SET_CLIENT: utf8
      COLLATION_CONNECTION: utf8_general_ci
        DATABASE_COLLATION: utf8_general_ci
2 rows in set (0.00 sec)

トリガーの削除

mysql> drop trigger student_insert;
Query OK, 0 rows affected (0.00 sec)

mysql> drop trigger student_delete;
Query OK, 0 rows affected (0.00 sec)

mysql> show triggers\G
Empty set (0.00 sec)

2.マルチテーブル情報の同期更新(追加、更新、削除)

# 创建tb1、tb2表
mysql> create table tb1
    -> (id int primary key auto_increment,
    -> name varchar(50),
    -> gender enum('男','女') default '男',
    -> age int);

mysql> create table tb2
    -> (id int primary key auto_increment,
    -> name varchar(50),
    -> salary double(10,2)
    -> );


# 分别创建插入、更新、删除的触发器
mysql> create trigger tb1_after_insert
    -> after insert
    -> on tb1 for each row
    -> begin
    ->   insert into tb2(name,salary) values(new.name,8000);
    -> end$$

mysql> create trigger tb1_after_update
    -> after update
    -> on tb1 for each row
    -> begin
    ->   update tb2 set name=new.name where name=old.name;
    -> end$$

mysql> create trigger tb1_after_delete
    -> after delete 
    -> on tb1 for each row
    -> begin
    ->   delete from tb2 where name=old.name;
    -> end$$

#

# 测试
---tb1插入三条记录
mysql> insert into tb1(name,age) values('张三','16');
mysql> insert into tb1(name,age) values('李四','22');
mysql> insert into tb1(name,age) values('王五','32');

---tb1、tb2均插入信息
mysql> select * from tb1;
+----+--------+--------+------+
| id | name   | gender | age  |
+----+--------+--------+------+
|  1 | 张三   ||   16 |
|  2 | 李四   ||   22 |
|  3 | 王五   ||   32 |
+----+--------+--------+------+
3 rows in set (0.00 sec)

mysql> select * from tb2;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | 张三   | 8000.00 |
|  2 | 李四   | 8000.00 |
|  3 | 王五   | 8000.00 |
+----+--------+---------+
3 rows in set (0.00 sec)

# 修改id=2的学生name
mysql> update tb1
    -> set name='老六'
    -> where id=2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from tb1;
+----+--------+--------+------+
| id | name   | gender | age  |
+----+--------+--------+------+
|  1 | 张三   ||   16 |
|  2 | 老六   ||   22 |
|  3 | 王五   ||   32 |
+----+--------+--------+------+
3 rows in set (0.00 sec)

mysql> select * from tb2;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | 张三   | 8000.00 |
|  2 | 老六   | 8000.00 |
|  3 | 王五   | 8000.00 |
+----+--------+---------+
3 rows in set (0.00 sec)

mysql> delete from tb1
    -> where id=3;
Query OK, 1 row affected (0.00 sec)

mysql> select * from tb1;
+----+--------+--------+------+
| id | name   | gender | age  |
+----+--------+--------+------+
|  1 | 张三   ||   16 |
|  2 | 老六   ||   22 |
+----+--------+--------+------+
2 rows in set (0.01 sec)

mysql> select * from tb2;
+----+--------+---------+
| id | name   | salary  |
+----+--------+---------+
|  1 | 张三   | 8000.00 |
|  2 | 老六   | 8000.00 |
+----+--------+---------+
2 rows in set (0.00 sec)

おすすめ

転載: blog.csdn.net/XY0918ZWQ/article/details/113606122