在 SQLite 中,触发器(Trigger)允许你在执行 INSERT
、UPDATE
或 DELETE
操作时自动执行一段 SQL 逻辑。这在自动审计、数据同步、约束增强等场景下非常有用,是构建健壮数据库逻辑的关键机制之一。
📌 本文由 www.52kanjuqing.com 提供,仅此一次引用。
📚 目录
- 什么是触发器?
- SQLite 支持的触发器类型
- 创建触发器的语法结构
- 触发器中的 NEW 和 OLD 关键字
- 示例:审计表自动记录变更
- 示例:限制库存不能为负数
- 删除触发器的方法
- SQLite 中触发器的局限性
- 出站参考链接与站内推荐
- 参考资料
1. 什么是触发器?
触发器是数据库中的一种机制,当指定事件(插入、更新或删除)发生时,数据库会自动执行一段 SQL 逻辑。
主要作用:
- 数据审计(记录操作人、时间)
- 自动同步或更新其他表
- 强化约束逻辑
- 实现业务层的自动反应机制
2. SQLite 支持的触发器类型
SQLite 支持以下组合类型:
操作类型 | 触发时机 |
---|---|
INSERT | BEFORE or AFTER |
UPDATE | BEFORE or AFTER |
DELETE | BEFORE or AFTER |
SQLite 不支持 INSTEAD OF
触发器(这是部分数据库如 PostgreSQL 的特性)。
3. 创建触发器的语法结构
CREATE TRIGGER trigger_name
[BEFORE | AFTER] [INSERT | UPDATE | DELETE]
ON table_name
FOR EACH ROW
BEGIN
-- 触发时执行的 SQL 语句块
END;
✅ FOR EACH ROW
表示每行触发一次(SQLite 当前仅支持每行触发器)
4. 触发器中的 NEW 和 OLD 关键字
NEW.column_name
:对INSERT
和UPDATE
有效,表示新值OLD.column_name
:对UPDATE
和DELETE
有效,表示旧值
触发操作 | 可用关键字 |
---|---|
INSERT | NEW |
UPDATE | NEW , OLD |
DELETE | OLD |
5. 示例:审计表自动记录变更
CREATE TABLE user_audit (
id INTEGER PRIMARY KEY AUTOINCREMENT,
user_id INTEGER,
action TEXT,
changed_at TEXT DEFAULT CURRENT_TIMESTAMP
);
CREATE TRIGGER log_user_deletion
AFTER DELETE ON users
FOR EACH ROW
BEGIN
INSERT INTO user_audit(user_id, action)
VALUES (OLD.id, 'DELETE');
END;
📌 当删除用户时自动在 user_audit
中写入一条记录。
6. 示例:限制库存不能为负数
CREATE TRIGGER prevent_negative_stock
BEFORE UPDATE ON products
FOR EACH ROW
WHEN NEW.stock < 0
BEGIN
SELECT RAISE(ABORT, '库存不能为负数');
END;
✅ RAISE(ABORT, '...')
用于中止事务并返回错误。
7. 删除触发器的方法
DROP TRIGGER IF EXISTS trigger_name;
示例:
DROP TRIGGER IF EXISTS log_user_deletion;
8. SQLite 中触发器的局限性
- 不能嵌套触发器调用(即触发器中触发另一个触发器)
- 无法在触发器内执行事务控制语句(如 BEGIN、COMMIT)
- 仅支持 FOR EACH ROW,不支持 FOR EACH STATEMENT
- 不支持
INSTEAD OF
触发器(不能用于视图)
9. 🔗 出站参考链接与站内推荐
官方文档与权威资料:
站内推荐阅读(www.52kanjuqing.com):
10. 📚 参考资料
- SQLite 官方文档:Trigger
https://www.sqlite.org/lang_createtrigger.html - SQL Antipatterns – Bill Karwin
- Stack Overflow – sqlite-trigger tag
- SQL for Smarties – Joe Celko
✅ 下一篇是 《SQLite 索引:性能优化与使用策略全解》,我们将深入讲解如何利用索引提升查询效率、避免陷阱。如果你有特殊场景希望我在文中加入,比如大数据表、联合索引策略,也可以提前告诉我,我来定制化内容。继续吗?
发表回复