当前位置: 首页 > news >正文

【MySQL】触发器与存储引擎

目录

  • 触发器
    • 基本概念
    • 触发器操作
      • 创建触发器
      • 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 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;

结果如下:

在这里插入图片描述

相关文章:

  • 基于开源模型的微调训练及瘦身打造随身扫描仪方案__用AI把手机变成文字识别小能手
  • 第二章 EXI协议原理与实现--7.5 Efficient XML库和OpenEXI.jar编解码交叉测试
  • Linux网络相关概念和重要知识(2)(UDP套接字编程、聊天室的实现、观察者模式)
  • XGBoost
  • 1987-2023年各省进出口总额数据整理(含进口和出口)(无缺失)
  • 目标检测中归一化的目的?
  • 大模型agent的构建
  • Python高级——类的知识
  • 域渗透工具推荐:impacket
  • 第6关:部分快速排序-用分治法实现
  • 2.Linux基本指令(下)
  • conda报错activate没办法激活环境
  • 从TouchDriver Pro到Touchdriver G1,Weart触觉手套全系解析:XR交互的“真实触感”如何实现?
  • 【北京迅为】iTOP-RK3568开发板OpenHarmony系统南向驱动开发UART接口运作机制
  • 各种排序汇总
  • Linux驱动开发基础(can)
  • 文献检索与下指南
  • fetch,ajax,axios的区别以及使用
  • 【python】OpenCV—Template Matching
  • 数学建模 第三节
  • 德州国资欲退出三东筑工,后者大股东系当地房企东海集团
  • 中国社联成立95周年,《中国社联期刊汇编》等研究丛书出版
  • 王东杰评《国家与学术》︱不“国”不“故”的“国学”
  • 联合国报告:全球经济前景恶化,面临高度不确定性
  • 新闻1+1丨城市,如何对青年更友好?
  • 与总书记交流的上海人工智能实验室年轻人,在探索什么前沿领域?