触发器是由数据库操作事件所触发的操作,这些事件包括: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);