mysql--触发器

触发器是由数据库操作事件所触发的操作,这些事件包括:update、insert into、delete。

触发器语法:

CREATE TRIGGER trigger_name  trigger_time  trigger_type  ON  table_name 

FOR EACH ROW trigger_stmt   

trigger_name  是触发器的名字

trigger_time 取值为BEFORE和AFTER,表示触发时机。

trigger_type 指触发事件,包括INSERT  UPDATE  DELETE

trigger_stmt 可以编写存储过程,比如 SET @result = NEW.字段。    NEW代表刚才更新或者插入的记录。

下面创建3个表:t_yuer,t_quqian,t_cunqian;

//取钱表
drop table if exists t_quqian;
create table t_quqian(
    id int(11) primary key AUTO_INCREMENT,
    money double(6,2),
    qudate TIMESTAMP DEFAULT NOW()
)
//存钱表
drop table if exists t_cunqian;
create table t_cunqian(
    id int(11) primary key AUTO_INCREMENT,
    money double(6,2),
    cundate TIMESTAMP DEFAULT NOW()
)
//余额表
drop table if exists t_yuer;
create table t_yuer(
    id int(11) primary key AUTO_INCREMENT,
    money double(6,2)
)

1.需求概述

①。现在我要做的是,假如我往 t_cunqian 表存200,那么会在 t_cunqian 表添加一条记录,而且这个时候 t_yuer 表会增加200。实现,那么这个时候我们需要为 t_cunqian 的insert添加一个触发器。

delimiter //
CREATE TRIGGER addmoney AFTER INSERT ON t_cunqian
FOR EACH ROW
BEGIN
		UPDATE t_yuer SET money=money + NEW.money;
END//
delimiter;

②。现在要做的是,假如我要将我的钱取出来,有个条件,当我取的钱多余我的余额的时候,这个时候我们必须要控制它,让他不能操作,其它则可以顺利操作。这里需要一个关键词 : SIGNAL。这个时候我们也可以用触发器实现:

delimiter//
CREATE TRIGGER withdraw AFTER INSERT ON t_quqian
FOR EACH ROW
BEGIN
	DECLARE out_money INT DEFAULT 0;
	DECLARE have_money INT DEFAULT 0;
	SET out_money = NEW.money;
	SELECT money into have_money from t_yuer;//将余额查出来赋值给变量,然后变量和取的钱判断就可以了。
	IF out_money > have_money THEN
		SIGNAL SQLSTATE  '45000'  SET MESSAGE_TEXT = 'money out of range';
	END IF;
  UPDATE t_yuer SET money=money - NEW.money;
END//
delimiter;

二、存储过程操作

DROP PROCEDURE IF EXISTS insteaduser;
delimiter//
CREATE PROCEDURE insteaduser(IN mycount INT(11))
BEGIN
	DECLARE id INT(11) DEFAULT 0;
	WHILE id < mycount DO
		SET id = id + 1;
		INSERT INTO cc VALUES(NULL,CONCAT("孙悟空",''+id));
	END WHILE;
END//
delimiter;
CALL insteaduser(8);

猜你喜欢

转载自blog.csdn.net/huohua0612/article/details/87101943