SQL 触发器
在本文中,您将学习有关触发器及其实现的例子。
结构化查询语言(SQL)中的触发器是一组过程语句,在特定表中的某些事件有响应时自动执行。触发器用于保护数据库中的数据完整性。
在SQL中,这个概念与现实生活中的触发器是相同的。例如,当我们扣动枪扳机时,子弹就会发射出去。
为了理解SQL中的触发器概念,让我们来看下面的假设情况:
假设Rishabh是一家跨国公司的人力资源经理。当新员工的记录输入到数据库中时,他必须向每位新员工发送“恭喜”消息。如果只有四五个员工,Rishabh可以手动完成,但如果新员工的数量超过一千人,那么在这种情况下,他必须在数据库中使用触发器。
因此,现在Rishabh必须在表中创建触发器,一旦将新员工的记录插入到数据库中,触发器将自动发送“恭喜”消息给新员工。
触发器始终与数据库中的特定表一起执行。如果我们删除表,则与该表关联的所有触发器也会自动删除。
在结构化查询语言中,触发器仅在以下事件之前或之后被调用:
- 插入事件: 当在表中插入新行时触发该事件。
- 更新事件: 当在表中修改现有记录时触发该事件。
- 删除事件: 当从表中删除现有记录时触发该事件。
SQL中的触发器类型
SQL中有六种触发器类型:
- AFTER INSERT触发器 在表中插入数据后调用该触发器。
- AFTER UPDATE触发器 在表中修改数据后调用该触发器。
- AFTER DELETE触发器 在从表中删除数据后调用该触发器。
- BEFORE INSERT触发器 在将记录插入到表中之前调用该触发器。
- BEFORE UPDATE触发器 在更新表中的记录之前调用该触发器。
- BEFORE DELETE触发器 在从表中删除记录之前调用该触发器。
SQL中触发器的语法
CREATE TRIGGER Trigger_Name
[ BEFORE | AFTER ] [ Insert | Update | Delete]
ON [Table_Name]
[ FOR EACH ROW | FOR EACH COLUMN ]
AS
Set of SQL Statement
在触发器语法中,首先,在CREATE TRIGGER关键字之后我们必须定义触发器的名称。之后,我们必须使用BEFORE或AFTER关键字定义任何一个事件。
然后,我们定义触发器要发生的那个表的名称。
在表名之后,我们必须定义行级或语句级的触发器。
最后,我们必须编写在事件发生时执行的SQL语句。
SQL中触发器的示例
为了理解SQL中触发器的概念,首先我们必须在触发器要执行的表上创建表。
下面的查询在SQL数据库中创建了 Student_Trigger 表:
CREATE TABLE Student_Trigger
(
Student_RollNo INT NOT NULL PRIMARY KEY,
Student_FirstName Varchar (100),
Student_EnglishMarks INT,
Student_PhysicsMarks INT,
Student_ChemistryMarks INT,
Student_MathsMarks INT,
Student_TotalMarks INT,
Student_Percentage );
以下查询显示了 Student_Trigger 表的结构:
DESC Student_Trigger;
输出:
Field | Type | NULL | Key | Default | Extra |
---|---|---|---|---|---|
Student_RollNo | INT | NO | PRI | NULL | |
Student_FirstName | Varchar(100) | YES | NULL | ||
Student_EnglishMarks | INT | YES | NULL | ||
Student_PhysicsMarks | INT | YES | NULL | ||
Student_ChemistryMarks | INT | YES | NULL | ||
Student_MathsMarks | INT | YES | NULL | ||
Student_TotalMarks | INT | YES | NULL | ||
Student_Percentage | INT | YES | NULL |
下面的查询在向表中插入学生记录之前触发触发器:
CREATE TRIGGER Student_Table_Marks
BEFORE INSERT
ON
Student_Trigger
FOR EACH ROW
SET new.Student_TotalMarks = new.Student_EnglishMarks + new.Student_PhysicsMarks + new.Student_ChemistryMarks + new.Student_MathsMarks,
new.Student_Percentage = ( new.Student_TotalMarks / 400) * 100;
以下查询将记录插入到Student_Trigger表中:
INSERT INTO Student_Trigger (Student_RollNo, Student_FirstName, Student_EnglishMarks, Student_PhysicsMarks, Student_ChemistryMarks, Student_MathsMarks, Student_TotalMarks, Student_Percentage) VALUES ( 201, Sorya, 88, 75, 69, 92, 0, 0);
要检查上述INSERT语句的输出,您需要键入以下SELECT语句:
SELECT * FROM Student_Trigger;
输出:
Student_RollNo | Student_FirstName | Student_EnglishMarks | Student_PhysicsMarks | Student_chemistryMarks | Student_MathsMarks | Student_TotalMarks | Student_Percentage |
---|---|---|---|---|---|---|---|
201 | Sorya | 88 | 75 | 69 | 92 | 324 | 81 |
SQL触发器的优点
以下是结构化查询语言中触发器的三个主要优点:
- SQL为在表中维护数据和引用完整性提供了一种替代方法。
- 触发器帮助执行计划任务,因为它们会自动调用。
- 它们可以捕捉各种企业数据库层的错误。
- 它们允许数据库用户在插入和更新之前验证值。
SQL触发器的缺点
以下是结构化查询语言中触发器的主要缺点:
- 它们没有编译。
- 无法找到和调试触发器中的错误。
- 如果在触发器中使用复杂代码,会导致应用程序运行变慢。
- 触发器会增加数据库系统的负载。