目录
- 触发器
- 基本概念
- 触发器操作
- 创建触发器
- NEW 与 OLD
- 查看触发器
- 删除触发器
- 注意事项
- 存储引擎
- 基本概念
- 基本操作
- 查询当前数据库支持的存储引擎
- 查看当前的默认存储引擎
- 查看某个表用的存储引擎
- 创建表时指定存储引擎
- 修改表的存储引擎
触发器
基本概念
概述:
- 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的 SQL 片段,但是触发器无需调用,当对数据库表中的数据执行 DML 操作时自动触发这个 SQL 片段的执行,无需手动条用
- 在 MySQL 中,只有执行 insert,delete,update 操作时才能触发触发器的执行
- 触发器的这种特性可以协助应用在数据库端确保数据的完整性,日志记录,数据校验等操作
- 使用别名 OLD 和 NEW 来引用触发器中发生变化的记录内容,这与其他的数据库是相似的。现在触发器还只支持行级触发,不支持语句级触发
触发器特点:
- 什么条件会触发?insert、delete、update
- 什么时候触发?在增删改前或者后
- 触发频率:针对每一行执行
- 触发器定义在表上,附着在表上
触发器操作
创建触发器
创建单执行语句的触发器
格式如下:
create trigger 触发器名 before|after 触发事件
on 表名 for each row
执行语句;
创建多执行语句的触发器
格式如下:
create trigger 触发器名 before|after 触发事件
on 表名 for each row
begin执行语句列表
end;
代码示例:
-- 用户表
create table user(uid int primary key ,username varchar(50) not null ,password varchar(50) not null
);-- 用户信息操作日志
create table user_logs(id int primary key auto_increment ,time timestamp ,log_text varchar(255)
);-- 定义触发器
create trigger trigger1 after inserton user for each rowinsert into user_logs values (null,now(),'有新用户添加');-- 在user表中添加数据
insert into user values (1,'张三','123456');
结果如下:
NEW 与 OLD
MySQL 中定义了 NEW 和 OLD,用来表示触发器的所在表中,触发了触发器的那一行数据,来引用触发器中发生变化的记录内容
触发器类型 | 触发器类型 NEW 和 OLD 的使用 |
---|---|
INSERT 型触发器 | NEW 表示将要或者已经新增的数据 |
UPDATE 型触发器 | OLD 表示修改之前的数据,NEW 表示将要或已经修改后的数据 |
DELETE 型触发器 | OLD 表示将要或者已经删除的数据 |
使用方法:NEW.columnName(columnName 为相应数据表某一字段名)
代码示例:
-- 用户表
create table user(uid int primary key ,username varchar(50) not null ,password varchar(50) not null
);-- 用户信息操作日志
create table user_logs(id int primary key auto_increment ,time timestamp ,log_text varchar(255)
);-- 定义insert触发器
create trigger trigger2 after inserton user for each rowinsert into user_logs values(null,now(),concat('有新用户添加,信息为:',new.uid,new.username,new.password));-- 在user表中添加数据
insert into user values (1,'张三','123456'),(2,'李四','123456'),(3,'王五','123456'),(4,'赵六','123456');-- 定义update触发器
create trigger trigger3 after updateon user for each rowinsert into user_logs values(null,now(),concat('有用户修改,修改前的信息为:',old.uid,old.username,old.password));
create trigger trigger4 after updateon user for each rowinsert into user_logs values(null,now(),concat('有用户修改,修改后的信息为:',new.uid,new.username,new.password));-- 修改user表中的数据
update user set password='234567' where uid=2;-- 定义delete触发器
create trigger trigger5 after deleteon user for each rowinsert into user_logs values(null,now(),concat('有用户删除,删除前的信息为:',old.uid,old.username,old.password));-- 删除user表中的数据
delete from user where uid=3;
结果如下:
查看触发器
格式如下:
show triggers;
代码示例:
show triggers;
结果如下:
删除触发器
格式如下:
drop trigger [if exists] trigger_name;
代码示例:
drop trigger if exists trigger2;
show triggers;
结果如下:
注意事项
MySQL 中触发器不能对本表进行 insert、update、delete 操作,以免递归循环触发
尽量少使用触发器,假设触发器触发每次执行 1s,添加 500 条数据就要触发 500 次触发器,就会导致效率变低
触发器是针对每一行的,对增删改非常频繁的表上不要使用触发器,会非常消耗资源
存储引擎
基本概念
概述:
- 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建、查询、更新和删除数据
- 不同的存储引擎提供不同的存储机制、索引技巧、锁定水平等功能。现在许多不同的数据库管理系统都支持多种不同的数据引擎。MySQL 的核心就是存储引擎
- 用户可以根据不同的需求为数据表选择不同的存储引擎
- 可以使用 SHOW ENGINES 命令可以查看 MySQL 的所有执行引擎,我们可以到默认的执行引擎是 InnoDB,支持事务,行级锁定和外键
分类:
- MyISAM:MySQL 5.5 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务
- InnoDB:事务型场景的首选引擎,支持 ACID 事务,支持行级锁定,MySQL 5.5 成为默认数据库引擎
- Memory:所有数据置于内存的存储引擎,拥有极高的插入、更新和查询效率,但会占用与数据量成正比的内存空间,且内容在 MySQL 重新启动时会丢失
- Archive:非常适合存储大量独立的历史记录数据(因不经常被读取),拥有高效的插入速度,但对查询的支持相对较差
- Federated:将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库,非常适合分布式应用
- CSV:逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。
- BlackHole:黑洞引擎,写入的任何数据都会消失,一般用于记录 binlog 做复制的中继。
- ERFORMANCE_SCHEMA:存储引擎,该引擎主要用于收集数据库服务器性能参数。
- Mrg_Myisam Merge:存储引擎,是一组 MyIsam 的组合,即将 MyIsam 引擎的多个表聚合起来,其内部没有数据,真正的数据仍在 MyIsam 引擎的表中,但可直接进行查询、删除、更新等操作。
常用引擎对比:
功能 | MyISAM | MEMORY | InnoDB |
---|---|---|---|
存储限制 | 256TB | RAM | 64TB |
支持事务 | No | No | Yes |
支持全文索引 | Yes | No | No |
支持 B 树索引 | Yes | Yes | Yes |
支持哈希索引 | No | Yes | No |
支持集群索引 | No | No | Yes |
支持数据索引 | Yes | Yes | Yes |
支持数据压缩 | Yes | No | No |
空间使用率 | 低 | N/A | 高 |
支持外键 | No | No | Yes |
基本操作
查询当前数据库支持的存储引擎
代码示例:
show engines;
结果如下:
查看当前的默认存储引擎
代码示例:
show variables like '%storage_engine%';
结果如下:
查看某个表用的存储引擎
格式如下:
show create table table_name;
代码示例:
create table student(id int ,name varchar(20)
);
show create table student;
结果如下:
创建表时指定存储引擎
格式如下:
create table table_name(...) engine = engine_name;
代码示例:
create table teacher(id int ,name varchar(20)
) engine = MyISAM;
show create table teacher;
结果如下:
修改表的存储引擎
格式如下:
alter table table_name engine = engine_name;
代码示例:
alter table teacher engine = InnoDB;
show create table teacher;
结果如下: