MySQL-Fallkampf - MySQL-Trigger

Vorwort

Diese Umgebung basiert auf dem Centos 7.8-System zum Erstellen von MySQL-5.7.14 für eine
bestimmte Konstruktion. Weitere Informationen finden Sie unter Aufbau der MySQL-5.7.14-Umgebung

Es ist häufig erforderlich, jedes Mal, wenn die Tabellen verbunden sind und dieselbe Anweisungszeichenfolge geschrieben wird, eine Verknüpfungsabfrage für die Tabellen emp und dept durchzuführen. Da die Daten der Gehaltswarteschlange sensibler sind, gelten gleichzeitig die externen Anforderungen nicht sichtbar.
Auf diese Weise können wir eine Ansicht erstellen


1. Was ist ein Auslöser?

Trigger (Trigger) ist eine spezielle gespeicherte Prozedur, deren Ausführung weder vom Programm aufgerufen noch manuell gestartet, sondern durch Ereignisse ausgelöst wird.
Wenn eine Operation (Einfügen, Löschen, Aktualisieren) für eine Tabelle ausgeführt wird, wird sie zur Ausführung aktiviert. Trigger werden häufig verwendet, um Einschränkungen der Datenintegrität und Geschäftsregeln zu verstärken.

Wenn beispielsweise die Informationen eines Schülers zur Schülertabelle hinzugefügt werden, sollte die Gesamtzahl der Schüler gleichzeitig geändert werden. Daher kann ein Trigger für die Schülertabelle erstellt werden, und jedes Mal, wenn ein Schülerdatensatz hinzugefügt oder gelöscht wird, wird eine Berechnungsoperation für die Gesamtzahl der Schüler durchgeführt, um die Konsistenz zwischen der Gesamtzahl der Schüler und der Anzahl der Datensätze sicherzustellen.

Trigger (Trigger) ist eine spezielle gespeicherte Prozedur. Der Unterschied besteht darin, dass die Ausführung der gespeicherten Prozedur von der CALL-Anweisung aufgerufen werden muss
und die Ausführung des Triggers nicht von der CALL-Anweisung aufgerufen oder manuell gestartet werden muss So lang wieWenn ein vordefiniertes Ereignis auftritt, wird es automatisch von MySQL aufgerufen.
Die Vorteile des Triggerprogramms sind folgende:

  • Die Ausführung des Triggerprogramms erfolgt automatisch. Sie wird sofort ausgeführt, nachdem entsprechende Änderungen an den Daten der Triggerprogramm-bezogenen Tabelle vorgenommen wurden.
  • Der Trigger kann andere Tabellen über verwandte Tabellen in der Datenbank kaskadieren und ändern.
  • Das Triggerprogramm kann komplexere Überprüfungen und Operationen implementieren als FOREIGN KEY-Einschränkungen und CHECK-Einschränkungen.

2. Lösen Sie den tatsächlichen Fall aus

1. Mehrere Tabellen für Schüler

Informationssynchronisation und neuer (Hinzufügen, Löschen)
Trigger erstellen

Bereiten Sie zwei Tabellen vor: student, student_total.
Wenn Schülerinformationen zur Schülertabelle hinzugefügt oder gelöscht werden, werden auch die Statistiken von student_total aktualisiert

# 创建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)

Zeigen Sie den erstellten Trigger an

# 查看创建的触发器
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)

Trigger löschen

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. Synchrone Aktualisierung von Informationen mit mehreren Tabellen (Hinzufügen, Aktualisieren, Löschen)

# 创建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)

Ich denke du magst

Origin blog.csdn.net/XY0918ZWQ/article/details/113606122