在 PostgreSQL 中,触发器(Triggers)是一种数据库对象,它允许在表上自动执行函数(通常称为触发函数)以响应与表上的数据操作相关的事件。触发器通常与 INSERT、UPDATE、DELETE 操作相关联,以在数据修改时执行自定义的业务逻辑。以下是有关 PostgreSQL 触发器的一些基本信息:

创建触发器

要创建触发器,你需要定义触发器的名称、触发的事件(BEFORE 或 AFTER)、触发的操作(INSERT、UPDATE、DELETE)、关联的表,以及触发时要执行的函数。
CREATE TRIGGER trigger_name
BEFORE INSERT OR UPDATE OR DELETE ON table_name
FOR EACH ROW
EXECUTE FUNCTION trigger_function();

在这个示例中:

  •  trigger_name 是触发器的名称。

  •  BEFORE 或 AFTER 指定触发器是在操作之前还是之后触发。

  •  INSERT OR UPDATE OR DELETE 指定触发器与哪些操作相关联。

  •  table_name 是触发器关联的表。

  •  FOR EACH ROW 指定触发器是行级触发器。

  •  EXECUTE FUNCTION trigger_function() 指定触发时要执行的函数。


触发函数

触发函数是在触发器触发时执行的函数。它通常包含自定义的业务逻辑。触发函数可以返回 NEW 和 OLD,这分别代表插入、更新或删除操作的新旧数据。
CREATE FUNCTION trigger_function() RETURNS TRIGGER AS $$
BEGIN
    -- Custom logic here
    RETURN NEW; -- or RETURN NULL; for BEFORE DELETE trigger
END;
$$ LANGUAGE plpgsql;

删除触发器

要删除触发器,可以使用 DROP TRIGGER 语句:
DROP TRIGGER trigger_name ON table_name;

示例

以下是一个简单的触发器示例,当在 employees 表中插入新记录时,会更新关联的 departments 表的计数。
CREATE TABLE departments (
    dept_id SERIAL PRIMARY KEY,
    dept_name VARCHAR(50),
    employee_count INTEGER
);

CREATE TABLE employees (
    emp_id SERIAL PRIMARY KEY,
    emp_name VARCHAR(50),
    dept_id INTEGER REFERENCES departments(dept_id)
);

CREATE OR REPLACE FUNCTION update_employee_count()
RETURNS TRIGGER AS $$
BEGIN
    IF TG_OP = 'INSERT' THEN
        UPDATE departments
        SET employee_count = employee_count + 1
        WHERE dept_id = NEW.dept_id;
    ELSIF TG_OP = 'DELETE' THEN
        UPDATE departments
        SET employee_count = employee_count - 1
        WHERE dept_id = OLD.dept_id;
    END IF;
    RETURN NULL;
END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER employee_count_trigger
AFTER INSERT OR DELETE ON employees
FOR EACH ROW
EXECUTE FUNCTION update_employee_count();

在上述例子中,update_employee_count 函数会根据插入或删除的操作更新相关部门的员工计数。然后,创建了一个触发器 employee_count_trigger,将其关联到 employees 表,以便在插入或删除记录时触发。


转载请注明出处:http://www.zyzy.cn/article/detail/8482/PostgreSQL