SQLite 触发器(Trigger)
在 SQLite 中,触发器(Trigger) 是一种数据库对象,用于在特定的数据库操作(如插入、更新或删除)发生时自动执行预定义的 SQL 操作。触发器可以帮助自动化数据管理过程,例如确保数据一致性、记录日志或实现复杂的数据验证。
1. 触发器的基本语法
触发器的基本语法如下:
CREATE TRIGGER trigger_name
trigger_time trigger_event
ON table_name
FOR EACH ROW
BEGIN
-- SQL 操作
END;
trigger_name:触发器的名称。trigger_time:触发器触发的时机,可以是:BEFORE:在触发的操作之前执行。AFTER:在触发的操作之后执行。trigger_event:触发器响应的事件,可以是:INSERT:在插入操作时触发。UPDATE:在更新操作时触发。DELETE:在删除操作时触发。table_name:触发器关联的表。FOR EACH ROW:表示触发器对每一行数据的操作执行一次。BEGIN ... END;:包含执行的 SQL 语句。
2. 示例:插入触发器
假设你有一个 employees 表,你希望在插入新员工记录时,自动记录当前时间为该员工的入职时间。
创建 employees 表的示例:
CREATE TABLE employees (
id INTEGER PRIMARY KEY,
first_name TEXT,
last_name TEXT,
hire_date TEXT
);
创建触发器:
CREATE TRIGGER set_hire_date
AFTER INSERT
ON employees
FOR EACH ROW
BEGIN
UPDATE employees
SET hire_date = CURRENT_TIMESTAMP
WHERE id = NEW.id;
END;
这个触发器会在每次向 employees 表插入一行数据后,自动设置该员工的 hire_date 为当前时间。
3. 示例:删除触发器
假设你有一个 logs 表,记录所有操作日志,当员工被删除时,你希望记录一条删除日志。
创建 logs 表:
CREATE TABLE logs (
log_id INTEGER PRIMARY KEY,
action TEXT,
employee_id INTEGER,
timestamp TEXT
);
创建触发器:
CREATE TRIGGER log_employee_deletion
AFTER DELETE
ON employees
FOR EACH ROW
BEGIN
INSERT INTO logs (action, employee_id, timestamp)
VALUES ('Deleted employee', OLD.id, CURRENT_TIMESTAMP);
END;
这个触发器会在每次删除 employees 表中的记录时,向 logs 表插入一条删除记录。
4. 示例:更新触发器
假设你有一个 employees 表和一个 salary_changes 表,当员工的薪水发生变动时,你希望记录一条薪资变动记录。
创建 salary_changes 表:
CREATE TABLE salary_changes (
change_id INTEGER PRIMARY KEY,
employee_id INTEGER,
old_salary REAL,
new_salary REAL,
change_date TEXT
);
创建触发器:
CREATE TRIGGER log_salary_update
AFTER UPDATE OF salary
ON employees
FOR EACH ROW
BEGIN
INSERT INTO salary_changes (employee_id, old_salary, new_salary, change_date)
VALUES (OLD.id, OLD.salary, NEW.salary, CURRENT_TIMESTAMP);
END;
这个触发器会在 employees 表的 salary 列被更新时,向 salary_changes 表插入一条记录,记录员工的薪资变动。
5. 删除触发器
如果不再需要某个触发器,可以通过 DROP TRIGGER 语句删除它:
DROP TRIGGER IF EXISTS trigger_name;
6. 注意事项
- 触发器只能在表级别创建,不能在视图上创建。
- SQLite 触发器的执行顺序是:
BEFORE触发器先执行,AFTER触发器后执行。 - 触发器可以使用
NEW和OLD关键字来访问新值和旧值: NEW.column_name:访问插入或更新操作中的新值。OLD.column_name:访问更新或删除操作中的旧值。
通过触发器,你可以自动化数据库操作,增强数据的完整性和一致性。更多详细内容请关注其他相关文章。