SQLite 触发器(Trigger)
                           
天天向上
发布: 2025-03-04 20:27:08

原创
468 人浏览过

在 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 触发器后执行。
  • 触发器可以使用 NEWOLD 关键字来访问新值和旧值:
  • NEW.column_name:访问插入或更新操作中的新值。
  • OLD.column_name:访问更新或删除操作中的旧值。

通过触发器,你可以自动化数据库操作,增强数据的完整性和一致性。更多详细内容请关注其他相关文章。

发表回复 0

Your email address will not be published. Required fields are marked *