mysql 触发器语法与应用示例

下面是一份关于“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日

相关文章

  • 常用的数据库都有哪些?

    关系型数据库(RDBMS) 关系型数据库(RDBMS)是最常见和广泛使用的数据库类型之一。它们使用SQL来管理和存储数据,并且将数据保存到表格中。在这种数据库类型中,每个表格包含一个键,以确保唯一性。表格之间使用关联建立连接,以支持多表查询。 优点: 数据结构简单,易于理解和维护 支持事务处理,确保数据的完整性和一致性 支持强大的查询功能,支持复杂的数据关系…

    数据库 2023年3月8日
    00
  • 教你使用VS Code的MySQL扩展管理数据库的方法

    教你使用VS Code的MySQL扩展管理数据库的方法 介绍 需要经常使用数据库的人,相信对于数据库管理工具都有一定的了解。而VS Code的MySQL扩展也为我们提供了一种方便快捷的方式来管理MySQL数据库。 本文将会为大家介绍使用VS Code的MySQL扩展管理数据库的方法,同时提供详细步骤和示例代码,帮助读者更好地掌握这个工具的使用。 安装MySQ…

    database 2023年5月21日
    00
  • mysql建表常用的sql语句汇总

    下面我将详细讲解“mysql建表常用的sql语句汇总”的完整攻略。 一、创建数据库 在使用mysql建表之前,我们需要根据需求创建一个数据库。创建数据库的sql语句如下: CREATE DATABASE mydb CHARACTER SET utf8 COLLATE utf8_general_ci; 上面的sql语句创建了一个名为mydb的数据库,并设置了数…

    database 2023年5月21日
    00
  • SQL Server序列SEQUENCE用法介绍

    SQL Server序列SEQUENCE用法介绍 序列SEQUENCE是什么? 序列SEQUENCE是SQL Server 2012及以上版本引入的一种新对象,可以生成不重复的数字序列,用于生成主键或其他需要连续数字的场景。 如何创建序列SEQUENCE? 可以使用以下语法创建序列SEQUENCE: CREATE SEQUENCE [schema_name …

    database 2023年5月21日
    00
  • Linux下创建Postgresql数据库的方法步骤

    下面是创建Postgresql数据库的方法步骤的完整攻略: 步骤一:安装Postgresql 首先需要安装Postgresql数据库,下面介绍在Ubuntu系统下的安装方法: sudo apt-get update sudo apt-get install postgresql 步骤二:创建一个Postgresql用户 创建一个新的Postgresql用户(…

    database 2023年5月22日
    00
  • 关系数据库和 NoSQL 的区别

    关系数据库与 NoSQL 的区别 关系数据库(Relation Database,简称 RDB)和 NoSQL(Not Only SQL,非仅仅是 SQL)是两种数据库管理系统,在数据存储、数据模型和扩展性等方面存在巨大差异。本文将详细介绍关系数据库和 NoSQL 数据库的区别,并提供相关实例说明。 关系数据库 数据模型 关系数据库采用的是基于表格的模型,表…

    database 2023年3月27日
    00
  • MySQL数据库事务transaction示例讲解教程

    以下是“MySQL数据库事务transaction示例讲解教程”的完整攻略: 什么是MySQL数据库事务? 一个MySQL数据库事务是一系列数据操作,它们要么都被执行,要么都不被执行,如果其中任何一个操作失败,整个事务都会被回滚,并恢复到之前的状态。 通俗来说就是一些操作要么都成功才算成功,否则都不算成功。 MySQL数据库事务处理 在MySQL中,我们可以…

    database 2023年5月21日
    00
  • Spring Boot 条件注解详情

    下面是关于Spring Boot条件注解的详细攻略: 1. 条件注解的概述 Spring Boot 的条件注解可以使得我们能够根据给定的条件来控制 Bean 是否被创建。在 Spring Boot 中一共有 @ConditionalOnBean、@ConditionalOnClass、@ConditionalOnMissingBean、@Conditiona…

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