【数据库SQL 】触发器的定义、执行与删除
1. 定义触发器(CREATE TRIGGER)
触发器是基于表定义的一组预定义操作,用于在特定事件发生时自动执行。
语法
CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE}
ON table_name
FOR EACH ROW
BEGIN
-- 触发器操作
SQL语句;
END;
关键点说明:
• trigger_name: 触发器的名称,需唯一。
• {BEFORE | AFTER}: 指定触发器在事件发生前(BEFORE)还是后(AFTER)执行。
• {INSERT | UPDATE | DELETE}: 指定触发器的触发事件,可以是插入、更新或删除。
• table_name: 触发器绑定的表。
• FOR EACH ROW: 每行触发一次操作。
• BEGIN...END: 定义触发器的具体逻辑,可以包含多条SQL语句。
定义触发器的例子
例1: 在插入新学生记录时检查年龄是否在有效范围内(18到30岁)
CREATE TRIGGER CheckStudentAge
BEFORE INSERT ON Students
FOR EACH ROW
BEGIN
IF NEW.Age < 18 OR NEW.Age > 30 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Age must be between 18 and 30.';
END IF;
END;
例2: 在删除课程记录时,自动删除未选课的学生记录
CREATE TRIGGER DeleteUnregisteredStudents
AFTER DELETE ON Courses
FOR EACH ROW
BEGIN
DELETE FROM Students WHERE StudentID NOT IN (SELECT DISTINCT StudentID FROM Courses);
END;
2. 执行触发器
触发器的执行是自动完成的,无需显式调用。
触发器会在其绑定的表发生相关事件时自动触发。
执行触发器的场景:
• 插入记录:触发 INSERT 触发器。
• 更新记录:触发 UPDATE 触发器。
• 删除记录:触发 DELETE 触发器。
执行流程例子
例1: 插入不符合年龄要求的学生记录
INSERT INTO Students (StudentID, Name, Age, Class) VALUES (101, '张三', 17);
• 执行结果:触发器检查 Age < 18,操作失败,提示 Age must be between 18 and 30.
例2: 删除课程记录后自动更新学生表
DELETE FROM Courses WHERE CourseID = 101;
• 执行结果:触发器会检查是否有未选课的学生,并自动删除相应记录。
3. 删除触发器(DROP TRIGGER)
当不需要触发器时,可以使用 DROP TRIGGER 删除它。
语法
DROP TRIGGER [IF EXISTS] trigger_name;
关键点说明:
• IF EXISTS: 可选参数,防止触发器不存在时报错。
• trigger_name: 要删除的触发器名称。
删除触发器的例子
删除触发器 CheckStudentAge
DROP TRIGGER IF EXISTS CheckStudentAge;
完整示例:定义、执行、删除触发器
1. 定义触发器
CREATE TRIGGER CheckStudentAge
BEFORE INSERT ON Students
FOR EACH ROW
BEGIN
IF NEW.Age < 18 OR NEW.Age > 30 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Age must be between 18 and 30.';
END IF;
END;
2. 触发器的自动执行
-- 插入数据
INSERT INTO Students (StudentID, Name, Age, Class) VALUES (101, '张三', 17);
-- 触发器执行,操作失败,提示错误信息。
3. 删除触发器
DROP TRIGGER IF EXISTS CheckStudentAge;
总结
• 定义触发器: 使用 CREATE TRIGGER,绑定表和事件,定义触发的逻辑。
• 执行触发器: 无需显式调用,自动触发。
• 删除触发器: 使用 DROP TRIGGER,指定触发器名称即可。