关系型数据库RDB中触发器Trigger的使用详解

关系型数据库RDB中触发器Trigger的使用详解

HarmonyOS
2024-05-22 23:09:31
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
编程指东

触发器(Trigger)是数据库的回调函数,指在数据库中发生特定的事件时被调用。例如,当数据库中表的某列数据发生更改时,可以使用触发器来记录本次修改的相关信息。

创建触发器Trigger

创建 触发器(Trigger) 的基本语法如下:

CREATE  TRIGGER trigger_name [BEFORE|AFTER] event_name   
ON table_name 
FOR EACH ROW(可省略)  
WHEN [condition] 
BEGIN   
-- 触发器逻辑 -- 
END;

说明:

  • RDB 的触发器(Trigger)可以指定在特定的数据库表发生 DELETE、INSERT 或 UPDATE 时触发,或在一个或多个指定表的列发生更新时触发。
  • RDB 只支持 FOR EACH ROW 触发器(Trigger),没有 FOR EACH STATEMENT 触发器(Trigger)。因此,FOR EACH ROW 是可省略的。
  • WHEN 子句和触发器(Trigger)逻辑中可以使用表单

NEW.column-name

OLD.column-name来引用插入、删除或更新的行元素,其中 column-name 是从与触发器关联的表的列的名称。

  • 在使用表单

NEW.column-name

OLD.column-name 时,在INSERT插入数据时,只能使用

NEW.column-name。在DELETE删除数据时,只能使用

OLD.column-name。在UPDATE更新数据时,两个皆可以使用。

  • 如果提供 WHEN 子句,则只针对 WHEN 子句为真的指定行执行 SQL 语句。如果没有提供 WHEN 子句,则针对所有行执行 SQL 语句。
  • BEFORE 或 AFTER 关键字决定何时执行触发器动作,决定是在关联行的插入、修改或删除之前或者之后执行触发器动作。
  • 当触发器相关联的表删除时,自动删除触发器(Trigger)。
  • 要修改的表必须存在于同一数据库中,作为触发器被附加的表或视图,且必须只使用

tablename,而不是

database.tablename

  • 一个特殊的 SQL 函数 RAISE() 可用于触发器程序内抛出异常
  • 关联的触发器执行失败时,对应的本次DELETE、INSERT、UPDATE操作也会不生效。

下面通过几个案例来说明如何使用Trigger。

例1 更新操作UPDATE触发器

假如有两个表:商品详情信息表goods_info和品类信息表goods_category,表结构信息如下:

CREATE TABLE IF NOT EXISTS goods_info( 
ID INTEGER PRIMARY KEY AUTOINCREMENT, 
NAME TEXT NOT NULL, 
CATEGORY TEXT NOT NULL, 
PRICE REAL, 
VENDORS TEXT, 
GOODS_NUM INT, 
CREATE_TIME DATETIME, 
LAST_TIME DATETIME); 
CREATE TABLE IF NOT EXISTS goods_category( 
ID INTEGER PRIMARY KEY AUTOINCREMENT, 
GOODS_ID INT NOT NULL, 
GOODS_NAME TEXT NOT NULL, 
CATEGORY_NAME TEXT NOT NULL, 
CREATE_TIME DATETIME, 
LAST_TIME DATETIME);

当商品详情表goods_info中的商品名称发生改变后,在品类信息表goods_category中的商品名称也同时更新过来。此Trigger可如下编写:

CREATE TRIGGER goods_category_update_trigger  
AFTER UPDATE OF name  
ON goods_info 
BEGIN   
UPDATE goods_category SET GOODS_NAME = NEW.name WHERE goods_category.GOODS_NAME = OLD.name; 
END;

在该语句中,"CREATE TRIGGER goods_category_update_trigger"为创建一个名为"goods_category_update_trigger"的触发器,该触发器执行条件为:"AFTER UPDATE OF name ON goods_info ",其语义为:当在商品详情表goods_info中的name列发生"UPDATE"更新操作后,执行下面的触发器逻辑语句。触发器逻辑语句为“UPDATE goods_category SET GOODS_NAME = NEW.name WHERE goods_category.GOODS_NAME = OLD.name;”,该语句中,"NEW.name"为数据库自带的表单函数,指在本次操作中更新后的行元素的值,"OLD.name"也是数据库自带的表单函数,其指更新前的行元素的值,可解释为:将品类信息表goods_category中的商品名称更新为表goods_info中的新商品名。

例2 新增操作INSERT触发器

如例1中的两个表:商品详情信息表goods_info和品类信息表goods_category,当商品详情表中新增某中商品信息前,品类表中对应的品类增加该商品。

CREATE TRIGGER goods_category_insert_trigger  
AFTER INSERT ON goods_info 
FOR EACH ROW 
BEGIN   
INSERT INTO goods_category(GOODS_ID,GOODS_NAME,CATEGORY_NAME,CREATE_TIME) values(NEW.ID,NEW.NAME,NEW.CATEGORY,datetime('now'));  
END;

在语句中,"CREATE TRIGGER goods_category_insert_trigger"为创建一个名为"goods_category_insert_trigger"的触发器,该触发器的执行条件为:" BEFORE INSERT ON goods_info FOR EACH ROW",其语义为:当表goods_info中每插入一行数据前,就执行触发器逻辑语句。触发器逻辑语句为" INSERT INTO goods_category (GOODS_ID,GOODS_NAME,CATEGORY_NAME,CREATE_TIME) values (NEW.ID,NEW.NAME,NEW.CATEGORY,datetime('now')) ;",该语句含义为:在表goods_category中插入一行数据,其中"NEW.ID"指表goods_info中新增的数据行的ID列的元素值,"NEW.NAME"指表goods_info中新增的数据的列NAME的元素值,"NEW.CATEGORY"指表goods_info中新增数据行的CATEGORY列的元素值。"datetime('now')"为数据库时间函数,指当前时间。

例3 删除操作DELETE触发器

还是上述两个表:商品详情信息表goods_info和品类信息表goods_category,当某个商品信息被删除前,即商品信息表的删除一行数据,如果该商品信息的ID小于1000,则在品类信息表中删除该商品的品类信息。该触发器如何编写呢?

如下所示:

CREATE TRIGGER goods_category_delete_trigger  
BEFORE DELETEON goods_info 
WHEN OLD.ID < 1000 
BEGIN   
DELETE FROM goods_category WHERE GOODS_ID = OLD.ID;  
END;

在该语句中,"CREATE TRIGGER goods_category_delete_trigger"为创建一个名为"goods_category_delete_trigger"的触发器,该触发器的执行条件为"BEFORE DELETE ON goods_info WHEN OLD.ID < 1000",其语义为在表goods_info中删除数据前,且当该数据的ID小于1000时,就执行触发器逻辑语句。触发器逻辑语句为"DELETE FROM goods_category WHERE GOODS_ID = OLD.ID;",该语句含义为从表goods_category中删除该商品的品类信息。

查看触发器Trigger

数据库中的触发器信息皆保存在系统自建的表 sqlite_master 中,我们可以从该表中获取已创建的触发器列表。

SELECT name FROM sqlite_master WHERE type = 'trigger';

该语句会列出数据库中所有表中已建立的触发器。

如果想查询特定表中的触发器trigger,可以使用如下方式:

SELECT name FROM sqlite_master WHERE type = 'trigger' AND tbl_name = 'test';

该语句会列出指定表test中已建立的触发器trigger。

删除触发器Trigger

如果想删除指定的触发器Trigger,可以通过如下方式:

DROP TRIGGER trigger_name;
分享
微博
QQ
微信
回复
2024-05-23 17:58:29
相关问题
关系数据库rdb如何进行加密
1730浏览 • 1回复 待解决
关系数据库使用分享
999浏览 • 1回复 待解决
关系数据库使用有懂吗?
2208浏览 • 1回复 待解决
HarmonyOS 关系数据库加密问题
267浏览 • 1回复 待解决
HarmonyOS 关系数据库批量插入数据
126浏览 • 1回复 待解决
关系数据库有知道吗?
2559浏览 • 1回复 待解决
如何进行关系数据库加密?
329浏览 • 2回复 待解决
关于harmony关系数据库升级问题
6018浏览 • 1回复 待解决
关系数据库相查询问题
124浏览 • 1回复 待解决
HarmonyOS 关系数据库api异步返回
290浏览 • 1回复 待解决
关系数据库RdbStore执行sql语句失败
1554浏览 • 1回复 待解决