如何在 MySQL 中使用触发器

作者选择了 多样性在技术基金作为 写给捐款计划的一部分接受捐款。

介绍

在使用关系数据库和 结构化查询语言(SQL)时,数据上的大多数操作都以明确执行的查询为结果执行,例如 SELECT, INSERT,或 UPDATE

但是,SQL 数据库也可以被命令自动执行预定义操作,每次通过 triggers发生特定事件。例如,您可以使用触发器来保持所有DELETE陈述的审计跟踪日志,或每次更新或附加到表的行时自动更新汇总统计总结。

在本教程中,您将使用不同的 SQL 触发器自动执行列被插入、更新或删除的操作。

前提条件

要遵循本指南,您需要运行基于 SQL 的关系数据库管理系统(RDBMS)的计算机。

一个运行 Ubuntu 20.04 的服务器,具有管理权限的非根用户和与 UFW 配置的防火墙,正如我们 Ubuntu 20.04 的初始服务器设置指南所描述的那样)。

  • MySQL 安装并在服务器上安全,如在 How To Install MySQL on Ubuntu 20.04中描述的那样。本指南是用一个非根 MySQL 用户进行验证,用 Step 3所描述的过程创建的。
  • MySQL 基本熟悉执行 SELECT, INSERT, UPDATEDELETE 查询以操作数据库中的数据,如在我们的 [How To

<$>[注] 注: 许多 RDBMS 使用自己的 SQL 实现程序. 虽然触发器被列为 SQL 标准的一部分,但该标准不强制执行其语法或严格的实现方式。

您还需要一个数据库,其中有一些表上载有样本数据,以便您可以练习使用函数. 我们鼓励您通过下面的 连接到MySQL和设置样本数据库部分,了解有关连接到MySQL服务器和创建在本指南中使用的测试数据库的详细信息。

连接到MySQL并设置样本数据库

在本节中,您将连接到MySQL服务器并创建一个样本数据库,以便您可以遵循以下部分中的示例。

您将存储目前所拥有的收藏品的详细信息,保持其总价值可用,并确保删除收藏品始终留下痕迹。

如果您的 SQL 数据库系统在远程服务器上运行,则从本地计算机输入 SSH 到服务器:

1[environment local]
2ssh sammy@your_server_ip

然后打开MySQL服务器提示,用您的MySQL用户帐户的名称代替sammy:

1mysql -u sammy -p

创建名为collectibles的数据库:

1CREATE DATABASE collectibles;

如果数据库创建成功,您将收到这样的输出:

1[secondary_label Output]
2Query OK, 1 row affected (0.01 sec)

若要选择可收集数据库,请运行以下使用语句:

1USE collectibles;

您将获得以下输出:

1[secondary_label Output]
2Database changed

选择数据库后,您可以在数据库中创建示例表. 表collectibles将包含数据库中有关collectibles的简化数据。

  • 名称:此列包含每个收藏品的名称,用最多为 50 个字符的 varchar' 数据类型表示
  • :此列使用 十进制 数据类型存储收集品的市场价值,最多在十进制点前有 5 个值,之后有 2 个值。

使用以下命令创建示例表:

1CREATE TABLE collectibles (
2    name varchar(50),
3    value decimal(5, 2)
4);

如果下列输出打印,则已创建表:

1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)

下一个表将被称为collectibles_stats,并将用于跟踪集合中的所有可收集的累积值。

  • count: 此列包含使用 int 数据类型表达的所有收集的数量。 _* value: 此列存储使用 decimal 数据类型的所有收集的累积值,最多为 5 值在十进制点前和 2 值之后。

使用以下命令创建示例表:

1CREATE TABLE collectibles_stats (
2    count int,
3    value decimal(5, 2)
4);

如果下列输出打印,则已创建表:

1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)

第三个和最后一个表将被称为collectibles_archive,它将跟踪从收藏中删除的所有收藏品,以确保它们永远不会消失。

  • 名称:此列包含每个删除的收藏品的名称,用最多为 50 个字符的 varchar` 数据类型表示
  • :此列存储在删除时使用 十进制 数据类型中的收集品的市场价值,最多在十进制点前和之后的 5
  • removed_on:此列使用 timestamp' 数据类型存储每个存档收藏品的删除日期和时间,默认值为 NOW()`,即在本表中插入新行列时的当前日期。

使用以下命令创建示例表:

1CREATE TABLE collectibles_archive (
2    name varchar(50),
3    value decimal(5, 2),
4    removed_on timestamp DEFAULT CURRENT_TIMESTAMP
5);

如果下列输出打印,则已创建表:

1[secondary_label Output]
2Query OK, 0 rows affected (0.00 sec)

接下来,通过运行以下INSERT INTO操作来加载collectibles_stats表的空集合的初始状态:

1INSERT INTO collectibles_stats SELECT COUNT(name), SUM(value) FROM collectibles;

操作输入会将一个单行添加到collectibles_stats中,使用汇总函数计算的值,以计算collectibles表中的所有行,并使用value列和SUM函数合并所有汇总的值。

1[secondary_label Output]
2Query OK, 1 row affected (0.002 sec)
3Records: 1 Duplicates: 0 Warnings: 0

您可以通过在表中执行一个SELECT语句来验证:

1SELECT * FROM collectibles_stats;

由于数据库中尚无可收集的元素,所以元素的初始数目为0,累积值为NULL:

1[secondary_label Output]
2+-------+-------+
3| count | value |
4+-------+-------+
5|     0 |  NULL |
6+-------+-------+
71 row in set (0.000 sec)

有了它,你已经准备好跟随其余的指南,并开始在MySQL中使用触发器。

了解 Triggers

Triggers是特定表的定义陈述,数据库每次在该表中发生特定事件时都会自动执行。

与表相关联的每个触发器都被标识为用户定义的名称和一对指示数据库引擎执行触发器的条件。

  • 数据库事件:当在表中运行INSERTUPDATEDELETE语句时,可以执行触发器。

将两个条件组合在一起,产生了6个单独的触发可能性,每次满足关联条件时都会自动执行。在执行符合条件的陈述之前发生的触发因素是INTER INSERT,INTER UPDATEINTER DELETE

声明满足条件后发生的触发因素是INSERT后,UPDATE后和DELETE后,这些触发因素可用于根据声明后数据库的最终状态在单独表中更新汇总值。

要执行诸如验证和操纵输入数据或存档已删除的行等操作,数据库允许从触发器内部访问数据值。对于INSERT触发器,只能使用新插入的数据。对于UPDATE触发器,可以访问原始和更新的数据。

在触发体内使用的数据在当前数据库中的记录和查询将保存的数据的记录下显示。

下面的示例显示用于创建新触发器的 SQL 语句的通用语法:

1CREATE TRIGGER trigger_name trigger_condition
2ON table_name
3FOR EACH ROW
4trigger_actions;

让我们把语法分成更小的部分:

  • CREATE TRIGGER'是用来在数据库中创建新触发器的 SQL 语句的名称. *Trigger_name' 是触发器的用户定义的名称,用于描述其作用,类似于表格名称和列名如何用来描述其含义.
  • On table_name ' 告诉数据库,触发器应监测table_name ' 表格上发生的事件。 (_) ) *触发-条件'是确定触发器何时运行的六个可能选择之一,例如BEFORE INSERT'. *FOR EACH ROW'告诉数据库,受触发事件影响的每行应运行触发器. 一些数据库支持除"FOR EACH ROW"之外的其他执行模式;然而,在MySQL的情况下,对被触发执行的语句所影响的每行从触发体运行语句是唯一的选项. (- ) * 三相行动是触发体,并定义了触发执行时会发生什么. 它通常是一个单一有效的SQL语句. 有可能在触发机体中加入多个语句,以使用BEGINEND`关键词进行复杂的数据操作,将语句列表一并附上。 然而,这不属于该课程的范围。 检查 [触发器的官方文档] (https://dev.mysql.com/doc/refman/8.0/en/trigger-syntax.html),以了解更多用于定义触发器的语法. ( (英语)

在下一节中,您将创建触发器,在输入更新操作之前操纵数据。

使用前插入前更新触发器操纵数据

在本节中,您将使用触发器在执行INSERTUPDATE语句之前操纵数据。

在本示例中,您将使用触发器来确保数据库中的所有可收集的使用上级名称以保持一致性. 没有使用触发器,您将不得不记得为每个输入更新陈述使用上级可收集的名称。

您将开始通过插入一个名为太空船模型的示例可收集的项目,价值为1250美元

1INSERT INTO collectibles VALUES ('spaceship model', 12.50);

以下消息确认该项目已被添加:

1[secondary_label Output]
2Query OK, 1 row affected (0.009 sec)

您可以通过执行SELECT查询来验证行是否被插入:

1SELECT * FROM collectibles;

以下输出将打印到屏幕上:

1[secondary_label Output]
2+-----------------+-------+
3| name            | value |
4+-----------------+-------+
5| spaceship model | 12.50 |
6+-----------------+-------+
71 row in set (0.000 sec)

可收藏的物品已保存为-is,名称仅用小写字母编写。

为了确保所有未来的收集元总是被写在上方,您将创建一个INSERT触发器. 使用触发器,该触发元执行 触发语句是运行,允许您操纵数据,将被传送到数据库之前它发生。

运行以下声明:

1CREATE TRIGGER uppercase_before_insert BEFORE INSERT
2ON collectibles
3FOR EACH ROW
4SET NEW.name = UPPER(NEW.name);

此命令会创建一个名为uppercase_before_insert的触发器,该触发器将执行在表上名为collectibles的所有INSERT陈述之前。

触发器中的SET NEW.name = UPPER(NEW.name)命令将为每个插入的行执行。SET SQL命令将右侧的值分配到左侧。在这种情况下,NEW.name表示插入声明将保存的name列的值。

注意:在运行CREATE TRIGGER命令时,您可能会遇到类似于`ERROR 1419(HY000):您没有 SUPER 特权,并启用了二进制日志(您可能想要使用更不安全的 log_bin_trust_function_creators 变量)。

从 MySQL 8 开始,MySQL 数据库引擎默认允许二进制日志,除非本地安装配置忽略了这一点。二进制日志跟踪所有修改数据库内容的 SQL 陈述以描述修改的保存事件的形式。

通过启用二进制日志,MySQL不允许创建触发器和存储程序,以确保数据在复制环境中的安全性和完整性。

然而,在本地环境和学习目的下,您可以安全地忽略MySQL防止创建触发器的方式。

若要取消二进制登录的默认设置,请以 root 登录 MySQL 并执行以下命令:

1SET GLOBAL log_bin_trust_function_creators = 1;

log_bin_trust_function_creators设置控制了创建触发器和存储函数的用户是否可以信任不会创建触发器导致不安全事件被写入二进制日志.默认情况下,设置的值为0,仅允许超级用户在启用二进制日志环境中创建触发器。

更新设置后,以 root 登录,以用户身份再次登录,然后重启CREATE TRIGGER语句。

要了解 MySQL 中的二进制日志和复制以及它如何与触发器有关,我们鼓励您参阅官方 MySQL 文档: The Binary LogStored Program Binary Logging

在在生产环境中使用触发器时进行复制或严格的按时恢复要求之前,请确保您对二进制日志一致性的影响进行了衡量。

注意:根据您的MySQL用户权限,您在执行CREATE TRIGGER命令时可能会收到错误:ERROR 1142(42000):TRIGGER命令被拒绝给用户user@host为表collectibles`。

1GRANT TRIGGER on *.* TO 'sammy'@'localhost';
2FLUSH PRIVILEGES;

更新用户权限后,以 root 登录,以用户身份重新登录,然后重新运行CREATE TRIGGER <$>)

MySQL 将打印以下消息,以确认触发器已成功创建:

1[secondary_label Output]
2Query OK, 1 row affected (0.009 sec)

现在尝试插入一个新的集合,再次使用一个下级参数到INSERT查询:

1INSERT INTO collectibles VALUES ('aircraft model', 10.00);

再一次,检查可收集表中的结果行:

1SELECT * FROM collectibles;

以下输出将打印到屏幕上:

1[secondary_label Output]
2+-----------------+-------+
3| name            | value |
4+-----------------+-------+
5| spaceship model | 12.50 |
6| AIRCRAFT MODEL  | 10.00 |
7+-----------------+-------+
82 rows in set (0.000 sec)

然而,这一次,新条目表示AIRCRAFT MODEL,上面有所有字母 - 与你试图插入的条目不同. 触发器在后台运行,并在行保存到数据库之前转换了字母盒。

所有新行现在都被触发器保护,以确保名称将被保存在上面的情况下。然而,仍然可以使用更新陈述来保存不受限制的数据。

1CREATE TRIGGER uppercase_before_update BEFORE UPDATE
2ON collectibles
3FOR EACH ROW
4SET NEW.name = UPPER(NEW.name);

两种触发器之间的区别在于触发器的标准,这一次是之前更新,这意味着触发器将在表上发布一次更新声明时执行,这会影响每个更新中现有的行,除了以前触发器所涵盖的新行之外。

MySQL 将输出确认触发器已成功创建的确认:

1[secondary_label Output]
2Query OK, 0 row affected (0.009 sec)

要验证新触发器的行为,请尝试更新航天器模型的价格值:

1UPDATE collectibles SET value = 15.00 WHERE name = 'spaceship model';

WHERE条款通过名称过滤要更新的行,而SET条款则将值更改为15.00

您将收到以下输出,确认声明更改了一个行:

1[secondary_label Output]
2Query OK, 1 row affected (0.002 sec)
3Rows matched: 1 Changed: 1 Warnings: 0

查看收藏表中的结果行:

1SELECT * FROM collectibles;

以下输出将打印到屏幕上:

1[secondary_label Output]
2+-----------------+-------+
3| name            | value |
4+-----------------+-------+
5| SPACESHIP MODEL | 15.00 |
6| AIRCRAFT MODEL  | 10.00 |
7+-----------------+-------+
82 rows in set (0.000 sec)

现在,除了执行声明更新至15.00的价格外,名称现在还表示SPACESHIP MODEL。当您运行UPDATE声明时,触发器被执行,影响了更新行上的值。

在本节中,您创建了两个触发器,在INSERTUPDATE查询之前工作,以便在将数据保存到数据库之前对数据进行匹配。

使用前删除触发器在删除行之前执行操作

即使您不再拥有一个项目,您可能希望在单独的表中留下有关删除的条目。 在本教程的开始时,您创建了一个名为collectibles_archive的第二个表,以跟踪从收藏中删除的所有收藏品。

检查档案表是否完全空,通过执行以下语句:

1SELECT * FROM collectibles_archive;

下面的输出将打印到屏幕上,确认collectibles_archive表是空的:

1[secondary_label Output]
2Empty set (0.000 sec)

现在,如果您对可收集表发出DELETE查询,则可以从表中删除任何行,而不会有任何痕迹。

为了解决这一问题,您将创建一个触发器,它将在可收集表中的所有DELETE查询之前执行。

运行以下命令:

1CREATE TRIGGER archive_before_delete BEFORE DELETE
2ON collectibles
3FOR EACH ROW
4INSERT INTO collectibles_archive (name, value) VALUES (OLD.name, OLD.value);

触发器被命名为archive_before_delete,并发生在DELETE表中的任何DELETE查询之前。对于每个被删除的行,将执行INSERT声明。反过来,INSERT声明会将一个新的行插入collectibles_archive表中,其中数据值是从OLD记录中提取的,这是用于删除的行:OLD.name成为name列,OLD.value成为value列。

数据库将确认触发器的创建:

1[secondary_label Output]
2Query OK, 0 row affected (0.009 sec)

有了触发器,请尝试从主要的收藏表中删除一个收藏品:

1DELETE FROM collectibles WHERE name = 'SPACESHIP MODEL';

输出证实查询成功执行:

1[secondary_label Output]
2Query OK, 1 row affected (0.004 sec)

现在列出所有收藏品:

1SELECT * FROM collectibles;

以下输出将打印到屏幕上:

1[secondary_label Output]
2+----------------+-------+
3| name           | value |
4+----------------+-------+
5| AIRCRAFT MODEL | 10.00 |
6+----------------+-------+
71 row in set (0.000 sec)

现在只剩下AIRCRAFT MODEL;SPACESHIP MODEL已被删除,不再存在于表中,但是,有了先前创建的触发器,这种删除应该在collectibles_archive表中注册。

执行另一个查询:

1SELECT * FROM collectibles_archive;

以下输出将打印到屏幕上:

1[secondary_label Output]
2+-----------------+-------+---------------------+
3| name            | value | removed_on          |
4+-----------------+-------+---------------------+
5| SPACESHIP MODEL | 15.00 | 2022-11-20 11:32:01 |
6+-----------------+-------+---------------------+
71 row in set (0.000 sec)

名称列已被填充了从被删除的行数据。第三列,删除_on并未通过定义的触发器明确设置,因此它需要在创建表时决定的默认值:任何新行创建日期。

有了这个触发器,您现在可以确定所有DELETE查询将导致在collectibles_archive中的日志列表,留下有关以前拥有的收藏品的信息。

在下一节中,您将使用在触发陈述后执行的触发器来更新概述表以基于所有可收集的汇总值。

使用在输入后,在更新后在删除后触发器来执行数据操纵后的操作

在前两节中,您使用在主要陈述之前执行的触发器执行操作,以基于更新数据库之前的原始数据。在本节中,您将更新汇总表以始终最新的计数和所有可收集的累积值,使用在预期陈述之后执行的触发器。

首先,检查collectibles_stats表:

1SELECT * FROM collectibles_stats;

由于您尚未将信息添加到此表中,所有可收集项目的数量为0,因此累积值为NULL:

1[secondary_label Output]
2+-------+-------+
3| count | value |
4+-------+-------+
5|     0 |  NULL |
6+-------+-------+
71 row in set (0.000 sec)

由于此表没有触发器,此前发布的查询以插入和更新可收集的数据不会影响此表。

目标是将值设置为collectibles_stats表的单行,以显示有关collectibles数和总值的最新信息。

您可以通过创建三个单独的触发器来做到这一点,这些触发器都是在相应的查询之后执行的。

1CREATE TRIGGER stats_after_insert AFTER INSERT
2ON collectibles
3FOR EACH ROW
4UPDATE collectibles_stats
5SET count = (
6    SELECT COUNT(name) FROM collectibles
7), value = (
8    SELECT SUM(value) FROM collectibles
9);

触发器被命名为stats_after_insert,并将执行每个INSERT查询到collectibles表,在触发体中运行UPDATE声明。

  • SELECT COUNT(名称) FROM collectibles 将获得收集的数。 _)* `SELECT SUM(价值) FROM collectibles'将获得所有收集的总值。

数据库将确认触发器的创建:

1[secondary_label Output]
2Query OK, 0 row affected (0.009 sec)

现在,尝试将以前删除的航天器模型重新插入到可收集的表中,以检查概述表是否会被正确更新:

1INSERT INTO collectibles VALUES ('spaceship model', 15.00);

数据库将打印以下成功消息:

1[secondary_label Output]
2Query OK, 1 row affected (0.009 sec)

您可以通过运行列出所有拥有的收藏品:

1SELECT * FROM collectibles;

以下输出将打印到屏幕上:

1[secondary_label Output]
2+-----------------+-------+
3| name            | value |
4+-----------------+-------+
5| AIRCRAFT MODEL  | 10.00 |
6| SPACESHIP MODEL | 15.00 |
7+-----------------+-------+
82 rows in set (0.000 sec)

有两个可收集的项目总值为25.00。 若要查看新插入的项目之后的摘要表,请执行以下查询:

1SELECT * FROM collectibles_stats;

这次,汇总表将列出所有拥有的可收集物件的数量为2和累积值为25.00,匹配以前的输出:

1[secondary_label Output]
2+-------+-------+
3| count | value |
4+-------+-------+
5|     2 | 25.00 |
6+-------+-------+
71 row in set (0.000 sec)

启动器stats_after_insertINSERT查询后运行,并更新collectibles_stats表以收集的当前数据()为准。 收集的统计数据涉及整个收集内容,而不仅仅是最后的插入。 由于收集现在包含两个项目(飞机和航天飞机模型),汇总表列出两个项目及其总值。

但是,更新现有项目或删除可收集的内容不会影响总结,要填补此差距,您将创建两个额外的触发器,执行相同的操作,但由不同的事件触发:

 1CREATE TRIGGER stats_after_update AFTER UPDATE
 2ON collectibles
 3FOR EACH ROW
 4UPDATE collectibles_stats
 5SET count = (
 6    SELECT COUNT(name) FROM collectibles
 7), value = (
 8    SELECT SUM(value) FROM collectibles
 9);
10
11CREATE TRIGGER stats_after_delete AFTER DELETE
12ON collectibles
13FOR EACH ROW
14UPDATE collectibles_stats
15SET count = (
16    SELECT COUNT(name) FROM collectibles
17), value = (
18    SELECT SUM(value) FROM collectibles
19);

您现在创建了两个新的触发器: stats_after_updatestats_after_delete. 每当您在 collectibles 表中运行一个 UPDATEDELETE 声明时,这两个触发器都会在 collectible_stats 表中运行。

成功创建这些触发器将打印以下输出:

1[secondary_label Output]
2Query OK, 0 row affected (0.009 sec)

现在,更新一个收藏品的价格值:

1UPDATE collectibles SET value = 25.00 WHERE name = 'AIRCRAFT MODEL';

「WHERE」条款通过名称过滤要更新的行,而「SET」条款则将值更改为「25.00」。

输出证实声明只改变了一行:

1[secondary_label Output]
2Query OK, 1 row affected (0.002 sec)
3Rows matched: 1 Changed: 1 Warnings: 0

再次检查更新后总结表的内容:

1SELECT * FROM collectibles_stats;

现在列出了40.00,这是更新后正确的值:

1[secondary_label Output]
2+-------+-------+
3| count | value |
4+-------+-------+
5|     2 | 40.00 |
6+-------+-------+
71 row in set (0.000 sec)

最后一步是验证总结表将正确反映删除一个收藏品. 尝试删除飞机模型与下列陈述:

1DELETE FROM collectibles WHERE name = 'AIRCRAFT MODEL';

以下输出证实查询成功执行:

1[secondary_label Output]
2Query OK, 1 row affected (0.004 sec)

现在列出所有收藏品:

1SELECT * FROM collectibles;

以下输出将打印到屏幕上:

1[secondary_label Output]
2+-----------------+-------+
3| name            | value |
4+-----------------+-------+
5| SPACESHIP MODEL | 15.00 |
6+-----------------+-------+
71 row in set (0.000 sec)

现在只剩下SPACESHIP MODEL。接下来,检查总结表中的值:

1SELECT * FROM collectibles_stats;

以下输出将打印:

1[secondary_label Output]
2+-------+-------+
3| count | value |
4+-------+-------+
5|     1 | 15.00 |
6+-------+-------+
71 row in set (0.000 sec)

现在计数列显示主表中只有一个集合值. 总值为15.00,匹配空间模型的值。

这些三种触发器在输入更新删除查询后共同工作,以保持汇总表与完整的可收集的列表同步。

在下一节中,您将学习如何操纵数据库上的现有触发器。

列出和删除触发器

在之前的部分中,您创建了新的触发器,因为触发器是数据库中定义的对象,就像表一样,您也可以列出并在需要时操纵它们。

若要列出所有触发器,请执行 SHOW TRIGGERS 语句:

1SHOW TRIGGERS;

输出将包括所有触发器,包括它们的名称,触发事件与时间(语句执行),以及触发器体的一部分的陈述和触发器定义的其他广泛细节:

 1[secondary_label Output, simplified for readability]
 2+-------------------------+--------+--------------+--------(...)+--------+(...)
 3| Trigger                 | Event  | Table        | Statement   | Timing |(...)
 4+-------------------------+--------+--------------+--------(...)+--------+(...)
 5| uppercase_before_insert | INSERT | collectibles | SET    (...)| BEFORE |(...)
 6| stats_after_insert      | INSERT | collectibles | UPDATE (...)| AFTER  |(...)
 7| uppercase_before_update | UPDATE | collectibles | SET    (...)| BEFORE |(...)
 8| stats_after_update      | UPDATE | collectibles | UPDATE (...)| AFTER  |(...)
 9| archive_before_delete   | DELETE | collectibles | INSERT (...)| BEFORE |(...)
10| stats_after_delete      | DELETE | collectibles | UPDATE (...)| AFTER  |(...)
11+-------------------------+--------+--------------+--------(...)+--------+(...)
126 rows in set (0.001 sec)

要删除现有触发器,您可以使用 DROP TRIGGER SQL 语句. 您可能不再需要强制执行可收集的名称的上级字母,因此不再需要uppercase_before_insertuppercase_before_update

1DROP TRIGGER uppercase_before_insert;
2DROP TRIGGER uppercase_before_update;

对于这两个命令,MySQL 将响应成功消息:

1[secondary_label Output]
2Query OK, 0 rows affected (0.004 sec)

现在,随着两个触发器消失,让我们在下方添加一个新的收藏品:

1INSERT INTO collectibles VALUES ('ship model', 10.00);

数据库将确认插入:

1[secondary_label Output]
2Query OK, 1 row affected (0.009 sec)

您可以通过执行SELECT查询来验证行是否被插入:

1SELECT * FROM collectibles;

以下输出将打印到屏幕上:

1[secondary_label Output]
2+-----------------+-------+
3| name            | value |
4+-----------------+-------+
5| SPACESHIP MODEL | 15.00 |
6| ship model      | 10.00 |
7+-----------------+-------+
82 rows in set (0.000 sec)

新添加的收藏元件以小写字母形式。由于名称从原始输出中保持不变,您已确认先前转换字母箱的触发器已不再使用。

现在你知道如何按名称列出和删除触发器。

结论

通过遵循本指南,您了解了什么是SQL触发器,以及如何在MySQL中使用它们来操纵INSERTUPDATE查询之前的数据。

您可以使用函数将一些数据操纵和验证卸载到数据库引擎中,确保数据完整性或隐藏一些数据库行为从日常数据库用户身上。本教程仅涵盖了用于此目的使用触发器的基本知识。

如果您想了解更多有关 SQL 语言的不同概念并使用它的工作,我们鼓励您查看 如何使用 SQL 系列中的其他指南。

Published At
Categories with 技术
Tagged with
comments powered by Disqus