CREATE [TEMP] TRIGGER [IF NOT EXISTS] 触发器名
{BEFORE | AFTER | INSTEAD OF} {DELETE | INSERT | UPDATE [OF 列名]}
ON 表名
[FOR EACH ROW]
[WHEN 条件]
BEGIN
-- SQL 语句
END;
二、关键说明
关键字
说明
BEFORE
操作前执行(可阻止操作)
AFTER
操作后执行
INSTEAD OF
用于视图(替代原始操作)
FOR EACH ROW
每行触发一次(SQLite 默认)
WHEN
条件判断,只在满足时触发
三、特殊对象(仅在触发器内可用)
对象
含义
NEW
新插入或更新后的行数据
OLD
删除或更新前的行数据
NEW.列名 / OLD.列名
访问具体字段
四、常见示例
1. 自动更新时间戳
CREATE TRIGGER update_timestamp
AFTER UPDATE ON users
FOR EACH ROW
WHEN NEW.updated_at = OLD.updated_at -- 只有时间没变才更新
BEGIN
UPDATE users SET updated_at = CURRENT_TIMESTAMP
WHERE id = OLD.id;
END;
2. 防止删除管理员
CREATE TRIGGER prevent_delete_admin
BEFORE DELETE ON users
FOR EACH ROW
WHEN OLD.role = 'admin'
BEGIN
SELECT RAISE(ABORT, 'Cannot delete admin user!');
END;
3. 插入日志记录
-- 创建日志表
CREATE TABLE user_log (
id INTEGER PRIMARY KEY,
user_id INTEGER,
action TEXT,
timestamp DATETIME DEFAULT CURRENT_TIMESTAMP
);
-- 触发器:记录每次插入
CREATE TRIGGER log_user_insert
AFTER INSERT ON users
FOR EACH ROW
BEGIN
INSERT INTO user_log (user_id, action)
VALUES (NEW.id, 'INSERT');
END;
4. 库存自动扣减(订单插入时)
CREATE TRIGGER deduct_stock
AFTER INSERT ON order_items
FOR EACH ROW
BEGIN
UPDATE products
SET stock = stock - NEW.quantity
WHERE id = NEW.product_id;
-- 检查库存负值
UPDATE products
SET stock = 0
WHERE id = NEW.product_id AND stock < 0;
END;
5. INSTEAD OF 触发器(用于视图)
CREATE VIEW user_view AS
SELECT id, name, email FROM users;
CREATE TRIGGER instead_of_insert_user
INSTEAD OF INSERT ON user_view
FOR EACH ROW
BEGIN
INSERT INTO users (name, email) VALUES (NEW.name, NEW.email);
END;
五、查看与删除触发器
-- 查看所有触发器
PRAGMA trigger_list;
-- 或
SELECT name, sql FROM sqlite_master WHERE type = 'trigger';
-- 删除触发器
DROP TRIGGER IF EXISTS 触发器名;