MySQL玩转触发器

Posted PHP急先锋

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL玩转触发器相关的知识,希望对你有一定的参考价值。

1、触发器是一个特殊的存储过程,不同的是存储过程要用CALL来调用,而触发器不需要使用CALL。


创建触发器

语法如下:

CREATE TRIGGER trigger_name trigger_time trigger_event
    ON tbl_name FOR EACH ROW trigger_stmt
BEGIN
SQL;
END$

触发程序是与表有关的命名数据库对象,当表上出现特定事件时,将激活该对象。

触发程序与命名为tbl_name的表相关。tbl_name必须引用永久性表。不能将触发程序与临时表表或视图关联起来。

trigger_time是触发程序的动作时间。它可以是BEFORE或AFTER,以指明触发程序是在激活它的语句之前或之后触发。

trigger_event指明了激活触发程序的语句的类型。trigger_event可以是下述值之一:

·         INSERT:将新行插入表时激活触发程序,例如,通过INSERT、LOAD DATA和REPLACE语句。

·         UPDATE:更改某一行时激活触发程序,例如,通过UPDATE语句。

·         DELETE:从表中删除某一行时激活触发程序,例如,通过DELETE和REPLACE语句。

.......

废话不多说,直接上代码和效果:(核心知识:只要是被insert、update或者delete的那一列,那么该列所有字段都可以使用【new.字段名】来表示)

2、insert类触发器

DROP TABLE if EXISTS account;
CREATE TABLE account(acct_num INT ,amount DECIMAL(10,2),NUM INT );

CREATE TRIGGER ins_sum AFTER INSERT ON account FOR EACH ROW 
UPDATE 
  employee
SET
  Age = new.acct_num + 1 
WHERE ID = new.acct_num ;

INSERT INTO account(acct_num,amount) VALUES(1,2.00);
SELECT * FROM employee

 

3、update类触发器:ims_shopping_goods_option 商品规格从表,ims_shopping_goods 商品主表。 -- 逻辑关系:主表的商品id==从表goodsid。

            目的:实时监控主表商品的库存night_num值。

//建表

CREATE TABLE `ims_shopping_goods` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `is_nightpay` tinyint(1) DEFAULT ‘0‘ COMMENT ‘是否参加午夜订购专区‘,
  `night_num` int(11) DEFAULT NULL COMMENT ‘午夜订购库存‘,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=438 DEFAULT CHARSET=utf8;
CREATE TABLE `ims_shopping_goods_option` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `goodsid` int(10) DEFAULT ‘0‘,
  `erp_oid` int(11) NOT NULL DEFAULT ‘0‘ COMMENT ‘erp2规格id‘,
  `is_nightpay` tinyint(3) DEFAULT ‘0‘ COMMENT ‘是否参加午夜订购专区‘,
  `night_num` int(11) DEFAULT ‘0‘ COMMENT ‘午夜订购库存‘,
  PRIMARY KEY (`id`),
  KEY `indx_goodsid` (`goodsid`),
) ENGINE=MyISAM AUTO_INCREMENT=1178 DEFAULT CHARSET=utf8;

//创建触发器

DROP TRIGGER if EXISTS ins_night_num;  ## 删除触发器
CREATE TRIGGER ins_night_num AFTER UPDATE ON ims_shopping_goods_option FOR EACH ROW 
BEGIN
    UPDATE ims_shopping_goods SET night_num = (
        SELECT SUM(ims_shopping_goods_option.night_num) FROM ims_shopping_goods_option
        WHERE ims_shopping_goods_option.is_nightpay=1 
        AND ims_shopping_goods_option.goodsid=new.goodsid
    ) WHERE id=new.goodsid AND is_nightpay=1;
END

###测试触发器效果 UPDATE ims_shopping_goods_option SET night_num
= 8 WHERE id=1175; SELECT id,is_nightpay,night_num FROM ims_shopping_goods WHERE id=436;

 





以上是关于MySQL玩转触发器的主要内容,如果未能解决你的问题,请参考以下文章

MySql触发器使用

MySQL触发器

Kubeless 架构设计 | 玩转 Kubeless

玩转Bash变量

玩转Bash变量

如何设置 vscode 的代码片段,以便在自动完成后自动触发 vscode 的智能感知?