SQL中的触发器是为响应指定表上的某些事件而自动执行的过程代码。重要的是要了解这些小代码如何对数据库性能产生如此巨大的影响。 在本文中,您将学习如何实现触发器以及示例。
触发器是响应特定表上的某些事件而自动执行的SQL代码。这些用于维护数据的完整性。SQL中的触发器与现实世界的触发器类似。例如,当扣动扳机时,会发射子弹。我们都知道这一点,但这与 SQL 中的触发器有什么关系呢?为了理解这一点,让我们考虑一个假设的情况。
约翰是一家公司的营销官。当新客户数据输入公司数据库时,他必须向每个新客户发送欢迎消息。如果是一两个客户,John 可以手动完成,但如果计数超过一千怎么办?那么在这种情况下,触发器就派上用场了。
因此,现在 John 可以轻松地创建一个触发器,该触发器将在新客户的数据输入数据库后自动向其发送一封欢迎电子邮件。所以希望你对 SQL 中触发器的介绍很清楚。
永远记住,一张表不能有两个具有相似动作时间和事件的触发器。例如,一个表不能有两个BEFORE UPDATE触发器。但是我们可以有一个BEFORE UPDATE和一个BEFORE INSERT触发器,或者一个BEFORE UPDATE和一个AFTER UPDATE触发器。
在深入了解触发器的基础知识之前,我建议您了解 SQL 基础和规范化的概念,以便更好地掌握 SQL 中的触发器。
现在让我们看看触发器的语法。
Create Trigger Trigger_Name
(Before | After) [ Insert | Update | Delete]
on [Table_Name]
[ for each row | for each column ]
[ trigger_body ]
现在让我分解这个语法并详细解释每个部分。
创建触发器
这两个关键字用于指定将要声明的触发器块。
Trigger_Name
它指定触发器的名称。触发器名称必须是唯一的并且不应重复。
( Before | After )
这指定何时执行触发器。它告诉我们触发触发的时间,即在进行中的事件之前或之后。
之前触发器用于在将记录值保存到数据库之前更新或验证记录值。
After 触发器用于访问系统设置的字段值并影响其他记录中的更改。激活 after 触发器的记录是只读的。如果我们想更新记录,我们不能使用 After 触发器,因为它会导致只读错误。
[插入 | 更新 | Delete ]
这些是 DML 操作,我们可以在给定的触发器中使用它们中的任何一个。
关于[ Table_Name ]
我们需要提及应用触发器的表名。不要忘记使用on关键字并确保所选表存在于数据库中。
[ 每行 | 对于每一列]
行级触发器在行的任何列值更改之前或之后执行
列级触发器在指定列更改之前或之后执行
[ trigger_body]
它由调用触发器时需要执行的查询组成。
所以这都是关于一个简单的触发器。但是我们也可以创建一个可以做多进程的嵌套触发器。处理它并在正确的时间终止它也非常重要。如果我们没有正确结束触发器,可能会导致无限循环。
您可能想知道在哪种情况下我们可以使用嵌套触发器。与其给您量身定制的答案,不如让我与您分享一个场景,这将帮助您更好地理解嵌套触发器。继续前面的场景,John 为添加到公司数据库中的每个新客户发送了一封电子邮件。现在,如果他希望跟踪收到电子邮件的客户数量怎么办?现在 John 需要创建一个嵌套触发器来跟踪计数以及发送电子邮件。
以上就是触发器的语法,现在让我们尝试在 SQL 中实现触发器的示例。
触发器示例:
在下面的触发器中,我们试图在学生的详细信息更新到数据库后立即计算学生的百分比。
CREATE TRIGGER sample_trigger
before INSERT
ON student
FOR EACH ROW
SET new.total = new.marks/6;
这里的“ NEW”关键字指的是受到影响的行。
我们可以使用触发器执行许多操作。有些可能很简单,有些可能有点复杂,但是一旦我们通过查询,它就很容易理解。
删除触发器
DROP TRIGGER trigger name;
显示触发器
下面的代码将显示所有存在的触发器。
SHOW TRIGGERS;
下面的代码将显示特定数据库中存在的所有触发器。
SHOW TRIGGERS
IN database_name;
例子:
SHOW TRIGGERS IN edureka;
在上面的示例中,将显示名为 Edureka 的数据库中存在的所有触发器。
我们还研究了插入前和插入后触发器的一些主要变体。我们已经在示例中看到了一个触发器。但是在表格的帮助下,让我们看看这到底是如何工作的。
数据库培训
既然我们已经了解了如何创建触发器,现在让我们了解触发器的两种变体,即插入前和插入后。为了实现它们,让我们创建一个包含各种列的学生表,如下所示:
CREATE TABLE Student(
studentID INT NOT NULL AUTO_INCREMENT,
FName VARCHAR(20),
LName VARCHAR(20),
Address VARCHAR(30),
City VARCHAR(15),
Marks INT,
PRIMARY KEY(studentID)
);
现在,如果我们执行这个查询,我们会得到下表。
让我们尝试使用第一个变体,即插入前
CREATE TRIGGER calculate
before INSERT
ON student
FOR EACH ROW
SET new.marks = new.marks+100;
在这里,当我们自动将数据插入学生表时,将调用触发器。触发器会将标记列添加 100 到学生列中。
现在让我们使用第二个变体,即 插入后
要使用此变体,我们需要一个表,即触发器将存储结果的百分比。使用以下代码创建百分比表。
create table Final_mark(
per int );
现在让我们使用插入后触发器
CREATE TRIGGER total_mark
after insert
ON student
FOR EACH ROW
insert into Final_mark values(new.marks);
这里当我们向表中插入数据时,total_mark 触发器会将结果存储在 Final_mark 表中。
你适合学Java吗?4大专业测评方法
代码逻辑 吸收能力 技术学习能力 综合素质
先测评确定适合在学习