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日

相关文章

  • MySQL数据库是什么

    MySQL数据库是一种开源、关系数据库管理系统,是目前互联网上最流行、最常用的数据库之一。它是由瑞典MySQL AB公司开发,并由Oracle公司管理和支持。MySQL的发展历程非常长,自1995年诞生以来,已经经历了多次重大升级和改进,包括版本升级、功能增强等,使其成为一个高效、可靠、功能强大、使用方便的数据库管理系统。 MySQL数据库的特点主要有: 开…

    2023年3月8日
    00
  • MySQL中DATE_FORMAT()函数将Date转为字符串

    MySQL中DATE_FORMAT()函数是将DATE类型字段格式化为指定的日期格式。它的语法如下: DATE_FORMAT(date,format) 其中,date是日期值,format是指定的格式化字符串。下面是几个常用的日期格式化代码: 代码 说明 %Y 年(4位数字) %m 月(01~12) %d 日(01~31) %H 小时(00~23) %i 分…

    database 2023年5月22日
    00
  • SQL中 decode()函数简介

    介绍 decode() 是SQL中非常强大的条件表达式函数之一。它被广泛用于在查询中测试和显示一个字段的不同值。decode()函数本质上是一个语言结构,它接受若干个条件和结果,对于输入数据的每一个值,按照顺序依次判断是否满足条件,如果满足,则返回对应的结果。 语法 decode() 函数的语法如下: decode( expression ,search ,…

    database 2023年5月21日
    00
  • MySQL子查询详细教程

    MySQL子查询详细教程 什么是MySQL子查询? MySQL子查询指的是在一个查询语句中嵌套另一个查询语句的查询方式,也叫做内部查询或者嵌套查询。子查询可以出现在SELECT、FROM、WHERE、IN和HAVING等语句中。 MySQL子查询的语法 SELECT column_name(s) FROM table_name WHERE column_na…

    database 2023年5月22日
    00
  • MySQL千万级数据的大表优化解决方案

    让我来介绍一下“MySQL千万级数据的大表优化解决方案”。 1. 背景 当我们的MySQL表中数据量达到千万级别时,表的查询、修改等操作会变得十分缓慢。这时就需要对表进行优化,以提高数据库性能。 2. 解决方案 以下是对MySQL大表进行优化的几种方案: 2.1 分区 将一张大表按照一定的规则分成多张小表,可以使查询效率大大提高。MySQL提供了分区功能,可…

    database 2023年5月19日
    00
  • 解决SQL2005备份数据库.dat或bak还原时的结构错误的解决方法

    解决SQL2005备份数据库.dat或bak还原时的结构错误的解决方法 在进行SQL Server数据库还原的时候,常常会遇到备份文件(.dat或.bak)结构错误的问题,这种问题的出现原因通常有以下几种: 1.备份文件本身损坏。 2.备份文件所在的路径中包含中文或其他非英文字符,或者备份文件名中包含特殊字符。 那么如何解决这个问题呢?下面详细介绍一下: 解…

    database 2023年5月21日
    00
  • 将所有符合条件的结果拼接成一列并用逗号隔开的一个sql语句

    针对“将所有符合条件的结果拼接成一列并用逗号隔开的一个sql语句”的需求,我们可以采用以下步骤: 使用SELECT语句查询符合条件的行,并将结果按照逗号隔开拼接成一列; 为了确保结果的顺序和唯一性,可以使用ORDER BY和DISTINCT关键字; 最终结果可以使用CONCAT函数连接各个行,生成一个字符串。 下面我们通过两个示例来详细讲解: 示例一: 我们…

    database 2023年5月21日
    00
  • linux下使用cmake编译安装mysql的详细教程

    以下是“linux下使用cmake编译安装mysql的详细教程”的完整攻略。 安装依赖项 在编译过程之前,请先确保您的系统上已经安装了以下依赖项: sudo apt-get install build-essential cmake libncurses5-dev libssl-dev libboost-dev 下载源码 从MySQL 官网上下载源码,将其解…

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