📜  SQL |触发器

📅  最后修改于: 2021-09-09 11:34:06             🧑  作者: Mango

触发器是当数据库有任何修改时系统自动执行的语句。在触发器中,我们首先指定触发器何时执行,然后在触发器执行时指定要执行的操作。触发器用于指定某些使用 SQL 的约束机制无法指定的完整性约束和引用约束。

例子 –
假设,我们正在向“捐赠者”表中添加一个元组,表示某人已献血。因此,我们可以设计一个触发器,它会自动将捐献血液的值添加到“Blood_record”表中。

触发器类型 –
我们可以为每个表定义 6 种类型的触发器:

  1. AFTER INSERT在数据插入表后激活。
  2. AFTER UPDATE:表中数据修改后激活。
  3. AFTER DELETE:从表中删除/移除数据后激活。
  4. BEFORE INSERT:在数据插入表之前激活。
  5. BEFORE UPDATE:在表中的数据被修改之前激活。
  6. BEFORE DELETE:在从表中删除/移除数据之前激活。

显示触发器实现的示例:

1. 写一个触发器,保证没有年龄小于25岁的员工可以插入到数据库中。

delimiter $$
CREATE TRIGGER  Check_age  BEFORE INSERT ON employee 
FOR EACH ROW
BEGIN
IF NEW.age < 25 THEN
SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'ERROR: 
         AGE MUST BE ATLEAST 25 YEARS!';
END IF;
END; $$
delimiter; 

说明:每当我们想向表 ’employee’ 插入任何元组时,在将这个元组插入表之前,名为 ‘Check_age’ 的触发器将被执行。此触发器将检查年龄属性。如果它大于 25,那么这个元组将被插入到元组中,否则将打印一条错误消息,指出“错误:年龄必须至少为 25 年!”

2. 创建一个触发器,该触发器将在employee 表中删除之前工作,并在另一个表employee_backup 中创建记录的副本。

在编写触发器之前,我们需要创建表employee_backup

create table employee_backup (employee_no int, 
      employee_name varchar(40), job varchar(40), 
      hiredate date, salary int, 
      primary key(employee_no)); 
delimiter $$
CREATE TRIGGER Backup BEFORE DELETE ON employee 
FOR EACH ROW
BEGIN
INSERT INTO employee_backup
VALUES (OLD.employee_no, OLD.name, 
        OLD.job, OLD.hiredate, OLD.salary);
END; $$
delimiter; 

说明:我们要创建一个备份表,用于保存不再是机构雇员的那些雇员的值。因此,我们创建了一个名为 Backup 的触发器,该触发器将在从表员工中删除任何 Tupple 之前执行。在删除之前,表employee 的所有属性的值都会存储在表employee_backup 中。

3. 编写一个触发器来计算使用每个插入语句插入的新元组的数量。

Declare count int
Set count=0;
delimiter $$
CREATE TRIGGER Count_tupples 
             AFTER INSERT ON employee 
FOR EACH ROW
BEGIN
SET count = count + 1;
END; $$
delimiter;

说明:我们要跟踪员工表中新元组的数量。为此,我们首先创建一个变量“count”并将其初始化为 0。之后,我们创建一个名为 Count_tupples 的触发器,它将在表 employee 中插入任何新 Tupple 后增加 count 的值。