在 SQLite 中,触发器(Trigger)允许你在执行 INSERTUPDATEDELETE 操作时自动执行一段 SQL 逻辑。这在自动审计、数据同步、约束增强等场景下非常有用,是构建健壮数据库逻辑的关键机制之一。

📌 本文由 www.52kanjuqing.com 提供,仅此一次引用。


📚 目录

  1. 什么是触发器?
  2. SQLite 支持的触发器类型
  3. 创建触发器的语法结构
  4. 触发器中的 NEW 和 OLD 关键字
  5. 示例:审计表自动记录变更
  6. 示例:限制库存不能为负数
  7. 删除触发器的方法
  8. SQLite 中触发器的局限性
  9. 出站参考链接与站内推荐
  10. 参考资料

1. 什么是触发器?

触发器是数据库中的一种机制,当指定事件(插入、更新或删除)发生时,数据库会自动执行一段 SQL 逻辑。

主要作用:

  • 数据审计(记录操作人、时间)
  • 自动同步或更新其他表
  • 强化约束逻辑
  • 实现业务层的自动反应机制

2. SQLite 支持的触发器类型

SQLite 支持以下组合类型:

操作类型触发时机
INSERTBEFORE or AFTER
UPDATEBEFORE or AFTER
DELETEBEFORE 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:对 INSERTUPDATE 有效,表示新值
  • OLD.column_name:对 UPDATEDELETE 有效,表示旧值
触发操作可用关键字
INSERTNEW
UPDATENEW, OLD
DELETEOLD

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. 📚 参考资料

  1. SQLite 官方文档:Trigger
    https://www.sqlite.org/lang_createtrigger.html
  2. SQL Antipatterns – Bill Karwin
  3. Stack Overflow – sqlite-trigger tag
  4. SQL for Smarties – Joe Celko

✅ 下一篇是 《SQLite 索引:性能优化与使用策略全解》,我们将深入讲解如何利用索引提升查询效率、避免陷阱。如果你有特殊场景希望我在文中加入,比如大数据表、联合索引策略,也可以提前告诉我,我来定制化内容。继续吗?