自学内容网 自学内容网

【MySQL】触发器与存储引擎

触发器

基本概念

概述:

  • 触发器,就是一种特殊的存储过程。触发器和存储过程一样是一个能够完成特定功能、存储在数据库服务器上的 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 insert
    on user for each row
    insert 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 insert
    on user for each row
    insert 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 update
    on user for each row
    insert into user_logs values
        (null,now(),concat('有用户修改,修改前的信息为:',old.uid,old.username,old.password));
create trigger trigger4 after update
    on user for each row
    insert 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 delete
    on user for each row
    insert 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 引擎的表中,但可直接进行查询、删除、更新等操作。

常用引擎对比:

功能MyISAMMEMORYInnoDB
存储限制256TBRAM64TB
支持事务NoNoYes
支持全文索引YesNoNo
支持 B 树索引YesYesYes
支持哈希索引NoYesNo
支持集群索引NoNoYes
支持数据索引YesYesYes
支持数据压缩YesNoNo
空间使用率N/A
支持外键NoNoYes

基本操作

查询当前数据库支持的存储引擎

代码示例:

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;

结果如下:

在这里插入图片描述


原文地址:https://blog.csdn.net/m0_72516377/article/details/146401809

免责声明:本站文章内容转载自网络资源,如侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!