mysql触发器l安全吗_浅谈mysql触发器

什么是触发器?简单的说,就是一张表发生了某件事(插入、删除、更新操作),然后自动触发了预先编写好的若干条SQL语句的执行。触发器本质也是存储过程,只是不需要手动调用,触发某事件时自动调用。触发器里的SQL语句是一个事务操作,具有原子性,要么全部执行,要么都不执行。

创建触发器的语句:

CREATE TRIGGER trigger_name trigger_time trigger_event ON table_name FOR EACH ROW trigger_stmt;

trigger_name:触发器的名称;

tirgger_time:触发时机,为BEFORE或者AFTER;

trigger_event:触发事件,为INSERT、DELETE或者UPDATE;

table_name:表示建立触发器的表名,就是在哪张表上建立触发器;

trigger_stmt:触发器的程序体,可以是一条SQL语句或者是用BEGIN和END包含的多条语句;

根据Mysql的插入、删除、更新操作,可以创建以下6种触发器:

BEFORE INSERT,BEFORE DELETE,BEFORE UPDATE,AFTER INSERT,AFTER DELETE,AFTER UPDATE

创建有多个执行语句触发器格式如下:

CREATE TRIGGER 触发器名 BEFORE|AFTER 触发事件

ON 表名 FOR EACH ROW

BEGIN

执行语句列表

END

其中,BEGIN与END之间的执行语句列表参数表示需要执行的多个语句,不同语句用分号隔开。mysql默认的结束符号是分号,与触发器中需要的分行起冲突,为解决此问题可用DELIMITER,如:DELIMITER ||,可以将结束符号变成||,当触发器创建完成后,可以用DELIMITER ;来将结束符号变成分号。

举例说明:

有两个表【用户表】和【日志表】,当一个用户被创建的时候,就需要在日志表中插入创建用户的log日志

创建用户表users:

CREATE TABLE `users` (

`id` int(11) unsigned NOT NULL AUTO_INCREMENT,

`name` varchar(255) CHARACTER SET utf8 DEFAULT NULL,

`add_time` int(11) DEFAULT 0,

`type` int(11) DEFAULT 0,

PRIMARY KEY (`id`),

KEY `name` (`name`(250)) USING BTREE

) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户表';

创建日志表logs:

CREATE TABLE `logs` (

`Id` int(11) NOT NULL AUTO_INCREMENT,

`type` int(11) DEFAULT 0,

`name` varchar(100) DEFAULT NULL,

`log` varchar(255) DEFAULT NULL COMMENT '日志说明',

PRIMARY KEY (`Id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='日志表';

创建触发器:

设置结束符号为||

DELIMITER ||

执行sql:

CREATE TRIGGER user_log AFTER INSERT ON users FOR EACH ROW

BEGIN

DECLARE s1 VARCHAR(40)character set utf8;

DECLARE s2 VARCHAR(20) character set utf8;#后面发现中文字符编码出现乱码,这里设置字符集

SET s2 = " is created";

SET s1 = CONCAT(NEW.name,s2); #函数CONCAT可以将字符串连接

INSERT INTO logs(name,log) values(NEW.name,s1);

END查看触发器:show triggers;

删除触发器:drop trigger 名字;

测试,往users表插入数据后,logs表会自动插入数据,简单的触发器就创建成功了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值