📜  SQL |触发器(1)

📅  最后修改于: 2023-12-03 15:20:16.156000             🧑  作者: Mango

SQL | 触发器

在SQL中,触发器(trigger)是一种特殊的存储过程,在特定情况下自动执行,通常是在对数据库进行修改操作(INSERT、UPDATE、DELETE)时触发。它可以对数据库的数据进行监控、验证、控制以及触发一些逻辑业务的处理,可以强化数据库的完整性、安全性和稳定性。

创建触发器

SQL中通过CREATE TRIGGER语句来创建触发器。以下是一个基本的CREATE TRIGGER语句的模板。

CREATE TRIGGER trigger_name
{BEFORE | AFTER} {INSERT | UPDATE | DELETE} ON table_name
[FOR EACH ROW]
BEGIN
 --触发器执行的SQL语句和逻辑处理部分
END;

|关键字|说明| |--|--| |trigger_name|触发器的名称,自定义| |BEFORE / AFTER|触发时间,执行顺序。BEFORE表示触发器在操作之前被执行,AFTER表示在操作之后执行。| |INSERT / UPDATE / DELETE|触发的操作类型| |table_name|触发器所附加的表名称| |FOR EACH ROW|表示每行触发,用于处理行级触发器| |BEGIN...END|在触发器中执行的SQL语句和逻辑处理部分,可以包含SELECT、UPDATE等SQL语句,也可以包含条件判断和循环等逻辑处理|

触发器应用示例
自增主键

在MySQL数据库中,如果想为某个表添加自增长的主键,可以使用AUTO_INCREMENT关键字。但是PostgreSQL数据库并不支持AUTO_INCREMENT,这个时候可以使用触发器来实现。

--创建触发器
CREATE TRIGGER book_auto_increment
BEFORE INSERT ON book --创建book表的触发器
FOR EACH ROW
WHEN (NEW.id IS NULL)
EXECUTE FUNCTION auto_increment(); --调用auto_increment()函数

--创建auto_increment()函数
CREATE FUNCTION auto_increment() RETURNS trigger AS --定义一个函数,它将作为触发器的执行体
$$
DECLARE
max_id INTEGER; --定义变量max_id
BEGIN
SELECT MAX(id) INTO max_id FROM book; --查询book表中id的最大值
IF max_id IS NULL THEN
NEW.id = 1;
ELSE
NEW.id = max_id + 1; --设置NEW.id为max_id+1
END IF;
RETURN NEW; --将NEW对象返回
END;
$$ LANGUAGE plpgsql; --指定该函数使用的语言
数据验证

在一个学生表中,某个学生的年龄必须大于等于18岁才能被插入到表中。通过创建一个触发器,在INSERT或UPDATE操作之前验证年龄是否符合要求,可以增加数据安全性。

--创建触发器
CREATE TRIGGER student_age_check
BEFORE INSERT OR UPDATE ON student --创建student表的触发器
FOR EACH ROW
WHEN (NEW.age < 18) --设置触发条件
EXECUTE FUNCTION age_check(); --调用age_check()函数

--创建age_check()函数
CREATE FUNCTION age_check() RETURNS trigger AS --定义一个函数,它将作为触发器的执行体
$$
BEGIN
RAISE EXCEPTION 'Age must be greater than or equal to 18'; --抛出异常(错误信息)
END;
$$ LANGUAGE plpgsql; --指定该函数使用的语言
数据同步

在两个表中,Person表和Salary表,当向Person表中插入一条记录时,如果该记录中包含薪水字段,那么触发器可以自动向Salary表中插入一条记录,保持数据的同步。

--创建Person表和Salary表
CREATE TABLE Person (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    age INTEGER,
    salary DECIMAL(10,2)
);

CREATE TABLE Salary (
    id SERIAL PRIMARY KEY,
    person_id INTEGER NOT NULL,
    salary DECIMAL(10,2) NOT NULL,
    FOREIGN KEY (person_id) REFERENCES Person(id)
);

--创建触发器
CREATE TRIGGER person_salary_sync
AFTER INSERT OR UPDATE ON Person --创建Person表的触发器
FOR EACH ROW
WHEN (NEW.salary IS NOT NULL) --设置触发条件
EXECUTE FUNCTION salary_sync(); --调用salary_sync()函数

--创建salary_sync()函数
CREATE FUNCTION salary_sync() RETURNS trigger AS --定义一个函数,它将作为触发器的执行体
$$
BEGIN
    INSERT INTO Salary (person_id,salary) --向Salary表中插入一条记录
    VALUES (NEW.id, NEW.salary);
    RETURN NEW; --将NEW对象返回
END;
$$ LANGUAGE plpgsql; --指定该函数使用的语言
总结

通过使用触发器,可以实现多种业务场景下的自动化处理,提高了数据库的完整性、安全性和稳定性。触发器可以监控数据库的修改操作,并通过执行SQL语句和逻辑处理实现数据同步、数据验证、自增主键等功能。在使用触发器的同时,需要注意它的执行时机、触发条件和逻辑处理的正确性,以避免出现不必要的问题。