触发器的使用

本文介绍了一个用于数据库管理系统中的触发器实现方案,该触发器在插入新记录时会根据新记录的内容更新库存表中的数据,包括增加或删除相应条目。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

位置:相关数据库管理系统

关键字:TRIGGER

例子:

CREATE TRIGGER 触发器名称
  AFTER INSERT
  ON 触发触发器的表
  FOR EACH ROW

  EXECUTE PROCEDURE 触发器函数();

触发器函数:

CREATE OR REPLACE FUNCTION 触发器函数()
  RETURNS trigger AS
$BODY$
DECLARE
    声明变量(触发触发器的表中没有的字段)
BEGIN
    --new代表着一个新的数据,即,触发触发器的表中没有的字段
    SELECT INTO record_count count(*) FROM sys_stock WHERE location_cd = new.location_cd AND figure_num = new.figure_num AND edition = new.edition --and product_num = new.product_num;
           AND lot_number = new.lot_number AND x_dimension = new.x_dimension AND y_dimension = new.y_dimension AND z_dimension = new.z_dimension;


   
    changed_new_ukeharai_unit := new.unit * sys_find_ukeharai_kbn_func(new.ukeharai_class);
    
    changed_new_ukeharai_num := new.quantity * sys_find_ukeharai_kbn_func(new.ukeharai_class);
    
    if record_count > 0 THEN
--一条sql语句,查询多个字段,以逗号分隔,赋值使用空格隔开
        SELECT INTO  old_stock_num, old_unit stock_num, unit FROM sys_stock WHERE location_cd = new.location_cd AND figure_num = new.figure_num AND edition = new.edition --and product_num = new.product_num;
                    AND lot_number = new.lot_number AND x_dimension = new.x_dimension AND y_dimension = new.y_dimension AND z_dimension = new.z_dimension;



        cal_result_stock_num := coalesce(old_stock_num, 0) + coalesce(changed_new_ukeharai_num, 0);
        cal_result_unit := coalesce(old_unit, 0) + coalesce(changed_new_ukeharai_unit, 0);


        if cal_result_stock_num = 0 AND cal_result_unit = 0 THEN

            DELETE FROM sys_stock WHERE location_cd = new.location_cd AND figure_num = new.figure_num AND edition = new.edition --and product_num = new.product_num;
                      AND lot_number = new.lot_number AND x_dimension = new.x_dimension AND y_dimension = new.y_dimension AND z_dimension = new.z_dimension;
        else

            UPDATE sys_stock SET stock_num = (coalesce(old_stock_num, 0) + coalesce(changed_new_ukeharai_num, 0)), unit = (coalesce(old_unit, 0) + coalesce(changed_new_ukeharai_unit, 0))
            WHERE location_cd = new.location_cd AND figure_num = new.figure_num AND edition = new.edition --and product_num = new.product_num;
            AND lot_number = new.lot_number AND x_dimension = new.x_dimension AND y_dimension = new.y_dimension AND z_dimension = new.z_dimension;
        END if;
    else

        new_uuid = uuid_generate_v4();
        new_modifier = 'sys-person_sys_admin';
        new_creator = 'sys-person_sys_admin';
        INSERT INTO sys_stock(id,location_cd, figure_num, edition, product_num, stock_num,lot_number,x_dimension,y_dimension,z_dimension,unit,item_name,location_select,arrival_day,last_processed_date,supplier_cd,supplier_select,million_single_weight
) values(new_uuid,new.location_cd, new.figure_num, new.edition, NULL, new.quantity, new.lot_number, new.x_dimension, new.y_dimension, new.z_dimension, new.unit, new.item_name, new.location_select, NULL, NULL, NULL, NULL, NULL);
        INSERT INTO basedataset(id,rev_ctrl_id,name,created,modified,deleted,remarks,modifier,creator,owner,owned_org,thread_id,parent_id,layout_id,app_id,revision,abbr) VALUES(new_uuid,NULL,NULL,now(),now(),false,NULL,new_modifier,new_creator,NULL,NULL,NULL,NULL,'sys_stock','app_production_mng',0,NULL);
    END if;
    
    return new;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

### Navicat 中 MySQL 触发器使用教程 #### 创建触发器的一般流程 创建触发器的过程涉及多个步骤,在Navicat Premium环境中,可以通过图形界面轻松完成这些操作。首先打开目标数据库连接并导航到所需的表[^1]。 对于具体的实现方式,假设正在使用的示例数据库为Sakila,其中包含了模拟DVD租赁业务的各种表格结构[^2]。现在考虑这样一个场景:每当有新的电影被加入`film`表时,希望自动更新另一个统计信息表中的相应条目;为此目的而设计的一个简单触发器可能看起来像这样: ```sql CREATE TRIGGER add_film_trigger AFTER INSERT ON film FOR EACH ROW BEGIN -- 假设存在名为 'statistics' 的表用来保存统计数据 UPDATE statistics SET total_films = total_films + 1 WHERE id = NEW.rating; END; ``` 上述SQL语句展示了如何定义一个名为 `add_film_trigger` 的触发器,该触发器会在每次向 `film` 表插入新行之后执行,并且会根据新增加影片的评级字段(`rating`)去修改对应的分类计数器[^4]。 #### 使用 INSTEAD OF 类型触发器 除了常见的 BEFORE 和 AFTER 类型外,MySQL 还支持一种特殊形式——INSTEAD OF 触发器,这主要用于处理视图上的 DML 操作。不过需要注意的是,这类触发器仅适用于某些特定版本和支持此特性的DBMS上[^3]。 #### 错误处理机制 如果在一个事务期间触发了某个带有错误条件判断逻辑的触发器,则整个事务将会回滚以保持数据一致性。这意味着任何违反预设规则的操作都不会影响已有的数据状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值