MYSQL
1 常用操作
CREATE DATABASE
CREATE TABLE
INSERT/UPDATE/DELETE/SELECT
2 Trigger(触发器)
当数据操作满足特定的情况,会自动执行指定的另一套SQL指令。
例如存在部门信息表:
t_department
t_department
ID NAME
1 Java
2 PHP
3 UI
CREATE TABLE t_department (
id int auto_increment,
name varchar(50),
primary key(id)
) DEFAULT CHARSET=UTF8;
INSERT INTO t_department (name) VALUES ('JAVA');
INSERT INTO t_department (name) VALUES ('PHP');
INSERT INTO t_department (name) VALUES ('UI');
并且存在员工信息表:
t_employee
t_employee
ID NAME DEPARTMENT_ID
1 JACK 2
2 TOM 3
3 JIM 3
4 BILLY 1
5 DAVID 2
CREATE TABLE t_employee (
id int auto_increment,
name varchar(50),
department_id int,
primary key(id)
) DEFAULT CHARSET=UTF8;
INSERT INTO t_employee (name, department_id) VALUES ('JACK', 2);
INSERT INTO t_employee (name, department_id) VALUES ('TOM', 3);
INSERT INTO t_employee (name, department_id) VALUES ('JIM', 3);
INSERT INTO t_employee (name, department_id) VALUES ('BILLY', 1);
INSERT INTO t_employee (name, department_id) VALUES ('DAVID', 2);
当需要删除某条部门信息表中的数据时,员工信息表中的数据也应该有相关的处理,例如删除ID=2
的部门之后,在员工信息表中,可以将原来DEPARTMENT_ID=2
的部门的员工设置新的部门信息DEPARTMENT_ID=0
使用触发器可以解决当某张表中的数据被执行了INSERT/DELETE/UPDATE操作时产生关联操作。
使用触发器的示例:
CREATE TRIGGER xx // 创建触发器并命名
AFTER // AFTER可以被替换为BEFORE
DELETE // 可以是INSERT/DELETE/UPDATE中的任何一种
ON table // 原来的操作是对哪张数据表的操作
FOR EACH ROW // 在MYSQL中是固定的
BEGIN // 准备开始执行另一张表的数据操作
操作 // 对另一张表的操作,可以是多条SQL语句
END // 结束
在使用触发器,原来的操作类型和BEFORE/AFTER会共同构成6种触发条件:
BEFORE INSERT
BEFORE UPDATE
BEFORE DELETE
AFTER INSERT
AFTER UPDATE
AFTER DELETE
每张数据表中的触发器只能配置以上每种条件中各1种,即同一张数据表最多存在6种触发器。
在创建触发器时,可以在满足触发条件后执行多条SQL指令,即以上代码格式中的“操作”可以是多条指令,如果确实需要有多条指令,这些指令应该使用分号(;
)进行分隔,但是,当编写“操作”时,创建触发器的语句尚未结束,一旦执到“操作”中的分号时,MYSQL就会开始尝试创建触发器,就会导致创建失败!
在MYSQL中,使用DELIMITER
指令可以改变结束标识,即默认情况下,MYSQL中把分号作为每条语句的结束,但是,可以更改!例如:
DELIMITER $
一旦执行以上语句后,MYSQL只会将$
作为结束标识,而不再使用分号!
需要注意的是:一旦改变了结束标识,在创建完触发器,应该还原为原来的结束标识:
DELIMITER ;
示例
针对以上列举的模拟数据和模拟需求,创建触发器应该是:
DELIMITER $
CREATE TRIGGER trigger_after_delete_department
AFTER DELETE ON t_department
FOR EACH ROW
BEGIN
UPDATE t_employee SET department_id=0 WHERE department_id=old.id;
END $
DELIMITER ;
以上示例代码中,触发条件对应的“操作”中,old
是触发执行条件时,被操作的那条数据。
show triggers; 可以显示所有的触发器
select * from t_department;select * from t_employee;
+----+------+
| id | name |
+----+------+
| 1 | JAVA |
| 2 | PHP |
| 3 | UI |
+----+------+
3 rows in set (0.00 sec)
+----+-------+---------------+
| id | name | department_id |
+----+-------+---------------+
| 1 | JACK | 2 |
| 2 | TOM | 3 |
| 3 | JIM | 3 |
| 4 | BILLY | 1 |
| 5 | DAVID | 2 |
+----+-------+---------------+
5 rows in set (0.00 sec)
delete from t_department where id=2;
+----+------+
| id | name |
+----+------+
| 1 | JAVA |
| 3 | UI |
+----+------+
2 rows in set (0.00 sec)
+----+-------+---------------+
| id | name | department_id |
+----+-------+---------------+
| 1 | JACK | 0 |
| 2 | TOM | 3 |
| 3 | JIM | 3 |
| 4 | BILLY | 1 |
| 5 | DAVID | 0 |
+----+-------+---------------+
5 rows in set (0.00 sec)
网友评论