MySQL触发器

当执行delete、update或insert操作时,可以使用触发器来触发某些操作。

 

创建触发器:

CREATE TRIGGER trigger_name trigger_time trigger_event   ON tbl_name 

 

FOR EACH ROW trigger_stmt

 

其中 trigger_name是触发器名,

trigger_time:BEFORE,AFTER

trigger_event:INSERT、UPDATE、DELETE

tbl_name:关联的表名

注意,INSERT除了插入操作,load data也能激活该事件。对于同一trigger_event,不能有两个相同trigger_time的触发器。

trigger_stmt:触发器被激活时执行的语句,可以使用单条语句,也可以使用BEGIN——END这样的复合语句。

 

例如:

mysql> CREATE TABLE account (acct_num INT, amount DECIMAL(10,2));

 

mysql> CREATE TRIGGER ins_sum BEFORE INSERT ON account

 

    -> FOR EACH ROW SET @sum = @sum + NEW.amount;

 

mysql> SET @sum = 0;

mysql> INSERT INTO account values(5,12.5);

mysql> SELECT @num;

 

在该例子中,关键字NEW.col_name在INSERT触发程序中引用;

另外一个关键字OLD.col_name可用于DELETE中

NEW和OLD均可用于UPDATE触发程序中。

 

old命令的列为只读的,new命名的列,如果具有select权限,可引用它,如果在before出发程序中,具有update权限,可使用set new.col_name = value的方法,在插入前更改值

 

另一个例子:

mysql> delimiter //

 

mysql> CREATE TRIGGER upd_check BEFORE UPDATE ON account

 

    -> FOR EACH ROW

 

    -> BEGIN

 

    ->     IF NEW.amount < 0 THEN

 

    ->         SET NEW.amount = 0;

 

    ->     ELSEIF NEW.amount > 100 THEN

 

    ->         SET NEW.amount = 100;

 

    ->     END IF;

 

    -> END;//

 

mysql> delimiter ;

 

当然,这里可以先定义存储程序,然后在触发器内call存储程序,这样就可以对存储程序进行复用。

 

删除触发器:

DROP TROGGER trigger_name

 

--------------------------------------------------------------------------

需要注意以下几点:

1.MySQL触发器针对行来操作,因此当处理大数据集的时候可能效率很低。

2.触发器不能保证原子性,例如在MYISAM中,当一个更新触发器在更新一个表后,触发对另外一个表的更新,若触发器失败,不会回滚第一个表的更新。InnoDB中的

 触发器和操作则是在一个事务中完成,是原子操作。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL 触发器是一个与表相关联的数据库对象,它在特定的INSERT、UPDATE或DELETE语句执行时自动执行。MySQL 触发器可以用于实现一些复杂的业务逻辑,比如在插入或更新数据时自动计算某些值、限制特定操作的执行等。 MySQL 触发器分为三种类型:BEFORE、AFTER和INSTEAD OF。BEFORE触发器在执行INSERT、UPDATE或DELETE语句之前执行,可以用于验证数据的合法性、修改数据等;AFTER触发器在执行INSERT、UPDATE或DELETE语句之后执行,可以用于记录日志、更新相关数据等;INSTEAD OF 触发器可以在执行INSERT、UPDATE或DELETE语句时替换原始的操作,可以用于实现自定义的数据更新逻辑。 MySQL 触发器的语法如下: ```sql CREATE TRIGGER trigger_name BEFORE|AFTER|INSTEAD OF INSERT|UPDATE|DELETE ON table_name FOR EACH ROW BEGIN -- 触发器执行的 SQL 语句 END; ``` 其中,`trigger_name` 是触发器的名称,`BEFORE|AFTER|INSTEAD OF` 指定触发器的类型,`INSERT|UPDATE|DELETE` 指定触发器要监听的操作类型,`table_name` 是要监听的表名,`FOR EACH ROW` 表示对表中每一行数据都执行触发器逻辑,`BEGIN` 和 `END` 之间是触发器要执行的 SQL 语句。 例如,下面的代码创建了一个在 `users` 表上监听 INSERT 操作的 BEFORE 触发器,用于自动给 `created_at` 字段赋值当前时间戳: ```sql CREATE TRIGGER users_created_at BEFORE INSERT ON users FOR EACH ROW BEGIN SET NEW.created_at = NOW(); END; ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值