머리말
이 환경은 Centos 7.8 시스템을 기반으로
특정 구성 을 위해 MySQL-5.7.14를 빌드 합니다. MySQL-5.7.14 환경 구성을 참조하십시오.
테이블이 연결될 때마다 emp 및 dept 테이블에 대해 조인 쿼리를 수행해야하는 경우가 많으며 동일한 문 문자열이 작성됩니다. 동시에 급여 대기열 데이터가 더 민감하기 때문에 외부 요구 사항은 다음과 같습니다. 보이지 않습니다.
이런 식으로 뷰를 생성하여 완료 할 수 있습니다.
1. 트리거 란?
트리거 (트리거)는 특수 저장 프로 시저이며, 실행은 프로그램에 의해 호출되지 않고 수동으로 시작되지 않고 이벤트에 의해 트리거됩니다.
테이블에 대한 작업 (삽입, 삭제, 업데이트)이 수행되면 실행을 위해 활성화됩니다. 트리거는 종종 데이터 무결성 제약 및 비즈니스 규칙을 강화하는 데 사용됩니다.
예를 들어 학생의 정보가 학생 테이블에 추가되면 총 학생 수를 동시에 변경해야합니다. 따라서 학생 테이블에 대한 트리거를 생성 할 수 있으며 학생 기록이 추가되거나 삭제 될 때마다 총 학생 수에 대한 계산 작업을 수행하여 총 학생 수와 기록 수 간의 일관성을 보장합니다.
트리거 (방아쇠) 특별한 저장 프로 시저입니다, 차이는 저장 프로 시저의 실행이 CALL 문에서 호출 할 필요가 있다는 것입니다,
그리고 트리거의 실행은 다음과 같이, CALL 문에서 호출 또는 수동으로 시작 할 필요가 없습니다 한미리 정의 된 이벤트가 발생하면 MySQL에 의해 자동으로 호출됩니다..
트리거 프로그램의 장점은 다음과 같습니다.
- 트리거 프로그램의 실행은 자동입니다. 트리거 프로그램 관련 테이블의 데이터를 변경 한 직후에 실행됩니다.
- 트리거는 데이터베이스의 관련 테이블을 통해 다른 테이블을 계단식으로 배열하고 수정할 수 있습니다.
- 트리거 프로그램은 FOREIGN KEY 제약 조건 및 CHECK 제약 조건보다 더 복잡한 검사 및 작업을 구현할 수 있습니다.
2. 실제 사례 트리거
1. 학생들을위한 여러 테이블
정보 동기화 및 신규 (추가, 삭제)
생성 트리거
student, student_total의 두 테이블을 준비
하고 student 테이블에서 학생 정보를 추가하거나 삭제하면 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)