mysql 触发器语法与应用示例

yizhihongxing

下面是一份关于“mysql 触发器语法与应用示例”的攻略:

什么是mysql触发器

MySQL触发器是一种特殊的存储过程,当特定的事件(如对一张表进行的 INSERT、UPDATE 和 DELETE 等操作)发生时,MySQL触发器会自动执行一个已经定义好的SQL语句集,因此它可以在数据库发生某些操作时进行响应并执行指定的操作。

触发器语法

其基本语法如下:

CREATE [OR REPLACE] TRIGGER trigger_name 
trigger_time trigger_event 
ON table_name FOR EACH ROW 
trigger_stmt

参数解释:

  • CREATE [OR REPLACE] TRIGGER — 创建触发器。OR REPLACE表示如果此触发器已经存在,则替换它。
  • trigger_name— 触发器名称,需在一个MySQL数据库中唯一。
  • trigger_time— 触发器执行时间,有 BEFOREAFTER 两种情况。
  • trigger_event— 触发器事件,可以是INSERTUPDATEDELETE
  • table_name— 触发器作用的表名。
  • FOR EACH ROW— 表示针对每一行触发,是一个必选项。
  • trigger_stmt— 触发器执行的MySQL语句集合。

触发器示例1:自动更新统计信息

假定现在有一个用户资料的表,名为 users,除去基本的用户信息(id、姓名、性别、年龄)外,还包含一个 score 字段,用于记录用户的当前积分。

我们可以通过触发器自动更新积分的最大值和总和到另外一张表 statistics 中。

首先,我们创建一个统计表 statistics

CREATE TABLE statistics ( 
  total_count INT UNSIGNED NOT NULL DEFAULT 0, 
  max_score INT UNSIGNED NOT NULL DEFAULT 0 
);

然后,我们创建一个名为 after_update_users 的触发器,该触发器被定义为在每次UPDATE之后在users表中执行。

CREATE TRIGGER after_update_users 
AFTER UPDATE ON users
FOR EACH ROW
BEGIN
  /* 更新最大积分和总积分 */
  UPDATE statistics SET 
    total_count = total_count + 1,
    max_score = GREATEST(max_score, NEW.score)
  /* 处理没有匹配行 */
  WHERE 1=1;

  /* 如果statistics没有产生过行 */
  /* 如果max_score和total_count值皆为0 */
  /* 则我们需要在插入此触发器被执行的第一行时插入他们 */
  IF ROW_COUNT() = 0 THEN
    INSERT INTO statistics (total_count, max_score) 
    VALUES (1, NEW.score);
  END IF;
END;

注意到 GREATEST(max_score, NEW.score) 是一个MySQL内置的函数,用于返回参数中最大的那个数。在这里,max_score表示统计表statistics中最大的积分值,而 NEW.score 则是在插入或更新操作中UPDATE操作更新前这个积分字段新的未更新的值(可以将他看成变量或者自定义参数)。

触发器示例2:在子表有新增时自动更新父表数据

假设现在有两张表, 父表orders和子表items,其中orders由三个字段构成:idamountcount,而items则是通过id与之关联的明细表,可以拥有多行数据,该表由三个字段构成: idpricequantity

当向子表 items 中添加一行新数据时,我们需要在父表 orders 中自动计算出总计行数(count)和总金额数(amount)并更新。

下面是示例SQL语句:

CREATE TABLE orders (
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  amount DECIMAL(7, 2) NOT NULL DEFAULT 0.00,
  count INT NOT NULL DEFAULT 0
);

CREATE TABLE items (
  id INT NOT NULL,
  price DECIMAL(7, 2) NOT NULL DEFAULT 0.00,
  quantity INT NOT NULL DEFAULT 0,
  PRIMARY KEY(id)
) ENGINE=INNODB;

INSERT INTO orders (amount, count) VALUES (0.00, 0);

为了将子表 items 与父表orders关联起来,我们需要在 items 表中添加一个触发器:

DELIMITER //
CREATE TRIGGER after_insert_items 
AFTER INSERT ON items 
FOR EACH ROW
BEGIN
  /* 通过 SUM(id), sum(price*quantity)来计算总金额和总数量 */
  UPDATE orders o
  SET
    amount = (SELECT SUM(price*quantity) FROM items WHERE id = NEW.id),
    count = (SELECT SUM(quantity) FROM items WHERE id = NEW.id)
  WHERE o.id = NEW.id;
END;
//

总结

在本文中,我们讨论了 MySQL 触发器的语法和应用示例。通过这两个示例,我们可以了解 MySQL 触发器的使用场景和优点,使得我们在实际应用中更加灵活高效。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:mysql 触发器语法与应用示例 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • MySQL字符集 GBK、GB2312、UTF8区别 解决MYSQL中文乱码问题

    下面是关于MySQL字符集 GBK、GB2312、UTF8区别以及解决MYSQL中文乱码问题的完整攻略。 MySQL字符集的介绍 在MySQL中,定义在表,列或者数据库级别的字符集都是为了规范化和控制文本数据存储、传输、排序等功能使用的。MySQL支持多种字符集,其中较为常见的有GBK、GB2312、UTF8等。 GBK GBK是国标码,是所有中国操作系统所…

    database 2023年5月21日
    00
  • SQL 在WHERE子句中引用别名列

    在SQL查询中,给列或表起一个别名是十分常见的。当然,在查询的过程中经常会使用WHERE子句来过滤数据,那么如何在WHERE子句中引用已经起了别名的列呢?下面是详细的攻略: 使用别名多次引用 当我们使用别名给列或表起名字时,WHERE子句可以轻松使用这个别名来过滤数据。例如,我们有一个名为“students”的表格,其中包含“student_id”和“nam…

    database 2023年3月27日
    00
  • PHP封装的PDO数据库操作类实例

    下面我来详细讲解一下“PHP封装的PDO数据库操作类实例”的完整攻略。 1. 什么是PDO? PDO即PHP数据对象,是PHP5中一个提供访问数据库的统一接口的类库。也就是说,它可以为不同的数据库提供透明的、便捷的、轻便的、安全的访问方式,支持MySQL、Oracle、MS SQL Server等多种数据库。 2. PDO的优势 封装的PDO类具有以下优势:…

    database 2023年5月21日
    00
  • Ubuntu Server下MySql数据库备份脚本代码

    下面是Ubuntu Server下MySql数据库备份脚本代码的完整攻略。 环境准备 在开始编写MySql数据库备份脚本之前,需要确保在Ubuntu Server系统中已经安装了MySql数据库,并且安装了mysqldump命令。此外,还需要创建一个备份目录来存储备份文件,可以使用以下命令创建: sudo mkdir /backup sudo chown -…

    database 2023年5月22日
    00
  • CouchDB 和 MongoDB 的区别

    CouchDB和MongoDB是两种常见的NoSQL数据库,在功能、性能、架构等方面有一些不同。下面是CouchDB和MongoDB的详细对比: 功能 数据模型:CouchDB采用了文档导向的数据模型,MongoDB采用了类似于BSON(Binary JSON)的数据模型。文档型数据库的数据结构更加灵活,而BSON的数据结构更加紧凑。 数据查询:CouchD…

    database 2023年3月27日
    00
  • SQL中视图和游标的区别

    SQL语言中,视图(View)和游标(Cursor)是两个非常重要的概念,它们都是用来处理数据库中数据的。视图是一个虚拟表,它是基于一个或多个表的查询结果组成的,而游标则是一种用来遍历数据的对象。虽然它们都是用来处理数据的,但是在实际应用中,它们有着很大的不同之处。下面我们将详细讲解视图和游标的区别。 视图 什么是视图 视图是SQL语言中的一种对象,它相对于…

    database 2023年3月27日
    00
  • Mysql数据库从5.6.28版本升到8.0.11版本部署项目时遇到的问题及解决方法

    MySQL数据库从5.6.28版本升级到8.0.11版本可能会遇到以下问题: 数据库备份不兼容 MySQL 8.0.11版本中更改了密码散列格式,这意味着使用早期版本的备份还原数据将会失败。要解决这个问题,你需要在升级之前进行一次新备份,以便你可以使用新格式的密码恢复你的数据。 示例:使用mysqldump命令进行备份 $ mysqldump -u root…

    database 2023年5月18日
    00
  • Oracle数据库系统紧急故障处理方法

    Oracle数据库系统紧急故障处理方法 前言 Oracle数据库系统一旦遭遇故障,可能会引发业务中断、数据丢失等重大问题。因此,为了降低故障对业务造成的影响,我们需要制定一套紧急故障处理方法。 故障分类 数据库系统故障可大致分为以下几类: 逻辑故障 在逻辑故障中,数据库系统能够正常运行,但是业务过程却无法正常执行,可能是因为数据出现了逻辑错误或者网络连接异常…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部