触发器
理解触发器的作用与适用场景
掌握触发器的创建与使用
能编写常见业务触发器
核心讲解
(1)什么是触发器
在表发生增删改操作时,自动触发执行的逻辑,不需要手动调用。
触发时机:BEFORE(操作前)、AFTER(操作后)
触发事件:INSERT、UPDATE、DELETE
行级触发器:每一行触发一次
语句级触发器:每条 SQL 触发一次
(2)使用场景
数据自动计算:比如修改时自动更新更新时间
数据审计:记录操作日志,谁改了、改了什么
数据校验:复杂的业务规则校验
级联操作:关联数据自动更新
(3)创建步骤
先写触发器函数(返回 trigger 类型)
再创建触发器,绑定到表上
代码示例
-- ===== 示例1:自动更新修改时间 =====
-- 给学生表加更新时间字段
ALTER TABLE student ADD COLUMN update_time timestamp;
-- 触发器函数
CREATE OR REPLACE FUNCTION update_time_func()
RETURNS trigger AS $$
BEGIN
NEW.update_time = CURRENT_TIMESTAMP;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
-- 创建触发器:更新前触发
CREATE TRIGGER tr_student_update_time
BEFORE UPDATE ON student
FOR EACH ROW
EXECUTE FUNCTION update_time_func();
-- 测试:更新一条数据
UPDATE student SET age = 22 WHERE id = 1;
-- 查看update_time自动更新了
SELECT * FROM student WHERE id = 1;
-- ===== 示例2:操作日志 =====
-- 日志表
CREATE TABLE student_log (
id serial PRIMARY KEY,
operate_type varchar(10),
student_id int,
old_name varchar(50),
new_name varchar(50),
operate_time timestamp DEFAULT CURRENT_TIMESTAMP
);
-- 触发器函数
CREATE OR REPLACE FUNCTION student_log_func()
RETURNS trigger AS $$
BEGIN
IF TG_OP = 'INSERT' THEN
INSERT INTO student_log(operate_type, student_id, new_name)
VALUES ('INSERT', NEW.id, NEW.name);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
INSERT INTO student_log(operate_type, student_id, old_name, new_name)
VALUES ('UPDATE', NEW.id, OLD.name, NEW.name);
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
INSERT INTO student_log(operate_type, student_id, old_name)
VALUES ('DELETE', OLD.id, OLD.name);
RETURN OLD;
END IF;
END;
$$ LANGUAGE plpgsql;
-- 创建触发器
CREATE TRIGGER tr_student_log
AFTER INSERT OR UPDATE OR DELETE ON student
FOR EACH ROW
EXECUTE FUNCTION student_log_func();
-- 测试
INSERT INTO student(name, class_id) VALUES ('测试学生', 1);
UPDATE student SET name = '修改后' WHERE id = 10;
DELETE FROM student WHERE id = 10;
-- 查看日志
SELECT * FROM student_log;
常见误区
触发器越多越好:触发器会增加数据库复杂度,排查问题困难,不要滥用
触发器里做复杂业务:触发器尽量轻量,复杂业务放到应用层
BEFORE 和 AFTER 搞混:要修改 NEW 的值用 BEFORE,记录日志用 AFTER
语句级和行级分不清:FOR EACH ROW 是行级,不加是语句级,大多数场景用行级
课后练习
给商品表加触发器,修改时自动更新更新时间
设计一个操作日志触发器,记录增删改操作
写一个删除触发器,删除学生时自动删除对应的选课记录
思考:触发器的优缺点有哪些?

