触发器(trigger)
使用触发器官网讲解
触发器语法和示例
CREATE TRIGGER ins_sum BEFORE INSERT ON account
FOR EACH ROW SET @sum = @sum + NEW.amount;
1.关键字BEFORE和AFTER表示触发动作的时间。BEFORE在插入表中的每一行之前激活
2.FOR EACH ROW定义触发器主体;每当触发触发器时执行的语句,对于受触发事件影响的没一行都会发生一次。
SET @sum = 0;
mysql> INSERT INTO account VALUES(137,14.98),(141,1937.50),(97,-100.00);
mysql> SELECT @sum AS 'Total amount inserted';
+-----------------------+
| Total amount inserted |
+-----------------------+
| 1852.48 |
+-----------------------+``
销毁触发器,请使用DROP TRIGGER语句
mysql> DROP TRIGGER test.ins_sum;
使用FOLLOWS,新触发器将在现有触发器之后激活。使用PRECEDES,新触发器将在现有触发器之前激活。默认情况下,具有触发事件和动作时间的触发器
CREATE TRIGGER ins_transaction BEFORE INSERT ON account
FOR EACH ROW PRECEDES ins_sum
SET
@deposits = @deposits + IF(NEW.amount>0,NEW.amount,0),
@withdrawals = @withdrawals + IF(NEW.amount<0,-NEW.amount,0);
IF(NEW.amount<0,-NEW.amount,0)为三元表达式
new和old的使用
在insert trigger中只能使用new,不能使用old。在delete trigger中只能使用old。在update trigger中old表示更新之后的值,new表示更新之前的值。old的值不能修改,在before trigger中new可以更改值,比如:SET NEW.col_name = value,但是在after trigger中就不能使用set来修改值了。
procedure语句
分别定义存储过程,然后使用简单的CALL语句从触发器调用存储过程会更容易 。如果要在多个触发器中执行相同的代码,这也将非常有利。
实践遇到的问题
聚合函数
having和group by的使用
where:在分组之前过滤
group by:按照某个字段或者某些字段进行分组
having:对分组之后的数据进行再次过滤
having是group by 的搭档,没有group by的话,having是不能使用的
分组函数一般都会和group by联合使用
任何一个分组函数(count,min,max,avg,sum)都是在group by语句执行之后才会执行
当一条sql语句没有group by的话,整张的结构会成一组
group by 是在where语句执行之后才会执行,所以where后面不能使用分组函数