MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL技能完整学习列表8、触发器、视图和事务——1、触发器(Triggers)的使用——2、视图(Views)的创建和使用——3、事务(Transactions)的管理



 

触发器(Triggers)的使用

MySQL的触发器(Triggers)是一种特殊类型的存储过程,它会在数据表上的特定操作(插入、更新或删除)发生时自动执行。触发器可以帮助我们实现数据的自动处理、验证和维护等任务。下面将详细说明MySQL触发器的使用方法,并提供具体的示例。

创建触发器

触发器可以使用CREATE TRIGGER语句创建。CREATE TRIGGER语句的基本语法如下:

CREATE TRIGGER trigger_name
    trigger_time trigger_event
    ON table_name FOR EACH ROW
    BEGIN
        -- 触发器的执行语句
    END;
  • trigger_name是触发器的名称。
  • trigger_time指定触发器的时间,可以是BEFORE或AFTER。
  • trigger_event指定触发的事件,可以是INSERT、UPDATE或DELETE。
  • table_name是触发器所关联的数据表名称。
  • FOR EACH ROW表示触发器将为每一行执行。
  • BEGIN ... END之间是触发器的主体,包含了一组SQL语句。

示例:创建一个简单的触发器

下面的示例演示了如何创建一个简单的触发器,该触发器在向users表插入新记录之前,自动为新记录的created_at字段设置当前时间。

DELIMITER //
CREATE TRIGGER SetCreatedAtBeforeInsert
    BEFORE INSERT ON users FOR EACH ROW
    BEGIN
        SET NEW.created_at = NOW();
    END //
DELIMITER ;

在这个示例中,我们创建了一个名为SetCreatedAtBeforeInsert的触发器,它在向users表插入新记录之前执行。触发器的主体是一个SET语句,将新记录的created_at字段设置为当前时间(使用NOW()函数获取)。由于我们使用了BEFORE INSERT,所以这个设置将在实际插入数据之前生效。

测试触发器

要测试触发器是否按预期工作,可以向关联的数据表中插入、更新或删除数据,并观察触发器的执行效果。以下是一个测试上面创建的触发器的示例:

INSERT INTO users (name, email) VALUES ('John Doe', 'john@example.com');
SELECT * FROM users; -- 查看插入的记录,created_at字段应该被自动设置了当前时间

视图(Views)的创建和使用

MySQL的视图(Views)是一种虚拟的表,它是根据SELECT语句的结果集创建的。视图本身不存储数据,它只是保存了一条用于生成结果集的SELECT语句。当查询视图时,MySQL会执行该SELECT语句并返回结果集。视图可以帮助我们简化复杂的查询操作、隐藏部分数据、实现数据抽象等。下面将详细说明MySQL视图的创建和使用方法,并提供具体的示例。

创建视图

视图可以使用CREATE VIEW语句创建。CREATE VIEW语句的基本语法如下:

CREATE VIEW view_name AS
    SELECT column1, column2, ...
    FROM table_name
    WHERE condition;
  • view_name是视图的名称。
  • column1, column2, ...是视图中要包含的列名。
  • table_name是要从中选择数据的表名。
  • WHERE condition是可选的筛选条件,用于限制视图中的数据。

示例:创建一个简单的视图

下面的示例演示了如何创建一个简单的视图,该视图从users表中选择姓名和电子邮件列:

CREATE VIEW UserNamesAndEmails AS
    SELECT name, email
    FROM users;

在这个示例中,我们创建了一个名为UserNamesAndEmails的视图,它包含了users表中的nameemail列。当查询该视图时,将返回这两列的数据。

使用视图

使用视图就像使用普通的表一样,可以在SELECT语句中引用视图名称来查询数据。以下是一个使用上面创建的UserNamesAndEmails视图的示例:

SELECT * FROM UserNamesAndEmails; -- 查询视图中的所有数据

还可以对视图应用筛选条件、排序等操作,就像对普通表一样:

SELECT * FROM UserNamesAndEmails WHERE email LIKE '%@example.com'; 
-- 筛选特定域名的用户

事务(Transactions)的管理

MySQL的事务(Transactions)是一组数据库操作语句的逻辑单元,可以保证这组操作要么全部执行成功,要么全部回滚(撤销)。事务管理对于保证数据的完整性、一致性和并发控制非常重要。下面将详细说明MySQL事务的管理方法,并提供具体的示例。

事务的基本要素

事务具有以下四个基本要素,通常简称为ACID特性:

  1. 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
  2. 一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态。
  3. 隔离性(Isolation):事务的执行不被其他事务干扰。即一个事务内部的操作及使用的数据对其他并发事务是隔离的,并发执行的各个事务之间不会互相干扰。
  4. 持久性(Durability):一旦事务提交,则其结果就是永久性的。

管理事务的SQL语句

MySQL中使用以下SQL语句来管理事务:

  1. START TRANSACTIONBEGIN:开始一个新的事务。
  2. COMMIT:提交当前事务,使所有已经执行的变更成为永久性的。
  3. ROLLBACK:回滚当前事务,撤销所有未提交的变更。
  4. SAVEPOINT:在事务内部设置一个保存点,用于后续的回滚到该点。
  5. ROLLBACK TO SAVEPOINT:回滚到指定的保存点。
  6. RELEASE SAVEPOINT:删除指定的保存点。
  7. SET TRANSACTION:设置事务的隔离级别。

示例:使用事务进行转账操作

假设我们有一个银行数据库,其中包含两个表:accounts(账户信息)和transactions(交易记录)。现在我们要执行一个转账操作,将A账户的资金转到B账户。这个操作需要同时更新两个账户的余额,并且要保证这两个更新操作的原子性,即要么都成功,要么都失败。我们可以使用事务来实现这个需求。

首先,我们创建测试表和插入测试数据:

CREATE TABLE accounts (
    id INT PRIMARY KEY,
    name VARCHAR(50),
    balance DECIMAL(10, 2)
);
CREATE TABLE transactions (
    id INT PRIMARY KEY AUTO_INCREMENT,
    from_account_id INT,
    to_account_id INT,
    amount DECIMAL(10, 2),
    transaction_date DATE,
    FOREIGN KEY (from_account_id) REFERENCES accounts(id),
    FOREIGN KEY (to_account_id) REFERENCES accounts(id)
);
INSERT INTO accounts (id, name, balance) VALUES (1, 'A', 1000);
INSERT INTO accounts (id, name, balance) VALUES (2, 'B', 500);

接下来,我们执行转账操作的事务:

START TRANSACTION; -- 开始事务
-- 从A账户扣款
UPDATE accounts SET balance = balance - 200 WHERE id = 1;
-- 向B账户存款
UPDATE accounts SET balance = balance + 200 WHERE id = 2;
-- 记录交易信息
INSERT INTO transactions (from_account_id, to_account_id, amount, transaction_date) VALUES (1, 2, 200, CURDATE());
-- 如果上述操作都成功执行,则提交事务,否则回滚事务
COMMIT; -- 或者使用 ROLLBACK 回滚事务
相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
存储 缓存 关系型数据库
MySQL底层概述—9.ACID与事务
本文介绍了数据库事务的ACID特性(原子性、一致性、隔离性、持久性),以及事务控制的演进过程,包括排队、排它锁、读写锁和MVCC(多版本并发控制)。文章详细解释了每个特性的含义及其在MySQL中的实现方式,并探讨了事务隔离级别的类型及其实现机制。重点内容包括:ACID特性(原子性、持久性、隔离性和一致性的定义及其实现方式)、事务控制演进(从简单的全局排队到复杂的MVCC,逐步提升并发性能)、MVCC机制(通过undo log多版本链和Read View实现高效并发控制)、事务隔离级别(析了四种隔离级别(读未提交、读已提交、可重复读、可串行化)的特点及适用场景)、隔离级别与锁的关系。
|
22天前
|
监控 关系型数据库 MySQL
|
1月前
|
SQL 关系型数据库 MySQL
MySQL事务日志-Undo Log工作原理分析
事务的持久性是交由Redo Log来保证,原子性则是交由Undo Log来保证。如果事务中的SQL执行到一半出现错误,需要把前面已经执行过的SQL撤销以达到原子性的目的,这个过程也叫做"回滚",所以Undo Log也叫回滚日志。
MySQL事务日志-Undo Log工作原理分析
|
2月前
|
SQL 安全 关系型数据库
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
事务是MySQL中一组不可分割的操作集合,确保所有操作要么全部成功,要么全部失败。本文利用SQL演示并总结了事务操作、事务四大特性、并发事务问题、事务隔离级别。
【MySQL基础篇】事务(事务操作、事务四大特性、并发事务问题、事务隔离级别)
|
1月前
|
SQL 存储 关系型数据库
MySQL进阶突击系列(05)突击MVCC核心原理 | 左右护法ReadView视图和undoLog版本链强强联合
2024年小结:感谢阿里云开发者社区每月的分享交流活动,支持持续学习和进步。过去五个月投稿29篇,其中17篇获高分认可。本文详细介绍了MySQL InnoDB存储引擎的MVCC机制,包括数据版本链、readView视图及解决脏读、不可重复读、幻读问题的demo演示。
|
2月前
|
SQL 关系型数据库 MySQL
MySQL进阶突击系列(04)事务隔离级别、AICD、CAP、BASE原则一直搞不懂? | 看这篇就够了
本文详细介绍了数据库事务的四大特性(AICD原则),包括原子性、隔离性、一致性和持久性,并深入探讨了事务并发问题与隔离级别。同时,文章还讲解了分布式系统中的CAP理论及其不可能三角关系,以及BASE原则在分布式系统设计中的应用。通过具体案例和图解,帮助读者理解事务处理的核心概念和最佳实践,为应对相关技术面试提供了全面的知识准备。
|
4月前
|
存储 SQL 关系型数据库
MySQL的事务隔离级别
【10月更文挑战第17天】MySQL的事务隔离级别
159 43
|
4月前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1844 14
MySQL事务日志-Redo Log工作原理分析
|
3月前
|
关系型数据库 MySQL
mysql事务特性
原子性:一个事务内的操作统一成功或失败 一致性:事务前后的数据总量不变 隔离性:事务与事务之间相互不影响 持久性:事务一旦提交发生的改变不可逆
|
3月前
|
关系型数据库 MySQL 数据库
MySQL事务隔离级别及默认隔离级别的设置
在数据库系统中,事务隔离级别是一个关键的概念,它决定了事务在并发执行时如何相互隔离。MySQL提供了四种事务隔离级别,每种级别都解决了不同的并发问题。本文将详细介绍这些隔离级别以及MySQL的默认隔离级别。