有些东西虽然简单,但简单的东西也容易忘记,比如mysql全局变量与局部变量这档子事,在mysql官方手册中也有专门的论述。看来也占用一席之地,所以本人也不错过,拿来看看,随便写上几句,以表心意。
全局(global)变量影响服务器整体操作。会话(session)变量影响具体客户端连接的操作。全局变量可能动态进行更改,不需要重新启动mysql服务器,但新设置的全局变量只影响从设置之后的连接,对设置之前的连接不起作用。我们可以把全局变量写在配置文件或者在命令行中指定。全局与局部的含义是不用说了。怎么设置和查询这些变量呢?set和select就可以解决此问题。下面就看看吧。
mysql如何设置用户变量:
> set @uservar1:='a'; > set @uservar2='b'; > select @uservar3:='c'; -- 使用此种方式必须得用":="的形式
mysql如何查看用户变量:
>select @uservar1;
mysql如何设置全局变量:
首先你得有super权限
> SET GLOBAL sort_buffer_size=value; > SET @@global.sort_buffer_size=value;
mysql如何查看全局变量:
> select @@global.varname; -- 注意这里有两个'@@' > show global variables like 'global-varname'; > select @@global-varname;
当你用select @@var_name搜索一个变量时(也就是说,不指定global、session或者local),mysql返回session值(如果存在),否则返回global值。
mysql如何设置会话变量:
会话变量只针对当前连接,且用户只能更改自己的session变量。
> set session sort_buffer_size=value; -- 可以用local代替session? > set @@session.sort_buffer_size=value; > set sort_buffer_size=value;
如果设置变量时不指定global、session或者local,默认使用session(会话级)。
mysql如何查看会话变量:
> select @@sort_buffer_size; > select @@session.sort_buffer_size; > show session variables like 'sort_buffer_size';
而对于show variables,如果不指定global、session或者local,mysql返回session值。总之一句话,在设置或者查询变量时,如果不特别指定mysql将会返回session级的变量,如果session变量不存在,则会返回global级的的变量。
本着一天一个知识点的原则,今天轮到看mysql的触发器了。昨天下午花了半个小时对基础知识一个全新的认识。之前从来都没有接触到任何数据库的触发器,所以对我来说,在这一点上完全陌生。下文的知识要点来自mysql官方帮助手册,作为一个归纳而已。这几天学的东西太多,也很基础,只是没有机会应用。怕是过不了几天就会忘记了。那个时候再来看看这里的笔记吧。
从字面上来理解mysql触发器,我认为它应该是一个事件,响应了某个动作而触发的事件。这样的命名非常的形象,这给我们的理解带来了一些帮助。什么动作可以触发一个动作呢?在数据库操作中,像insert,update,delete之类的就可以触发一个动作。看到这些insert之类的语句,我们认为,它应该是基于表(列)–当发生一个动作时,就对表(列)进行一些操作。那么用mysql的语法描述如下:
CREATE TRIGGER t1 AFTER|BEFORE (insert|update|delete) ON table-name FOR EACH ROW (insert|update|delete) other-table-name …
解析:大写的为关键字,其中trigger指示t1为一个触发器;AFTER|BEFORE:为触发时间;FOR EACH ROW:针对特定表中每一行。那么整句的意思就是:当往表(table-name)中插入更新删除数据之前或者之后,就触发t1,以插入更新删除表(other-table-name)中的数据。可能这样的中文解析有点含糊。下面通过简单的实例来看看这个过程。这里需要两个表:
表1:data:
>create table data(name char(255));
表2:chars:
>create table chars(count int(10));
往表chars插入一些数据:
> insert into chars(count) values(2),(3),(4);
在定义t1之前查看表chars中的数据:
mysql> select * from chars; +-------+ | count | +-------+ | 2 | | 3 | | 4 | +-------+
开始定义t1触发器:
mysql> CREATE TRIGGER t1 AFTER INSERT ON
-> data FOR EACH ROW UPDATE chars SET count
-> = count + CHAR_LENGTH(NEW.name);
往表data中插入一些数据:
> insert into data(name) values('q'),('w'),('e'),('r'),('t');
再来看下表chars中的数据:
mysql> select * from chars; +-------+ | count | +-------+ | 7 | | 8 | | 9 | +-------+
如何查看mysql触发器的定义:
mysql> select * from information_schema.triggers;
或者
mysql> SHOW TRIGGERS\G
*************************** 1. row ***************************
Trigger: t1
Event: INSERT
Table: data
Statement: UPDATE chars SET count
= count + CHAR_LENGTH(NEW.name)
Timing: AFTER
Created: NULL
sql_mode: STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
Definer: root@localhost
character_set_client: latin1
collation_connection: latin1_swedish_ci
Database Collation: latin1_swedish_ci
再来定义一个:
mysql> create trigger t2 before delete on
-> data for each row
-> update chars set count=count - char_length(OLD.name);
在data中删除一条记录:
> delete name from data where name='t';
查看触发器是否工作:
mysql> select * from chars; +-------+ | count | +-------+ | 6 | | 7 | | 8 | +-------+
一些说明:OLD,NEW这两个“变量”分别保存了数据在触发器工作之前和工作之后的值。这应该称作“引用”。官方文档说,这是mysql触发器的扩展,所以在其它数据库平台可能不被兼容。
注意问题:
1.触发器依赖于永久性表,不能是视图(view)或者临时表(temporary)
2.相同时间(before|after)的相同表上不能有两个事件(insert|update|delete)一样的触发器
3.触发程序与表相关,当对表执行INSERT、DELETE或UPDATE语句时,将激活触发程序
4.触发器被定义在不同的表中时,可以有同名
5.“在INSERT触发程序中,仅能使用NEW.col_name,没有旧行。在DELETE触发程序中,仅能使用OLD.col_name,没有新行。在UPDATE触发程序中,可以使用OLD.col_name来引用更新前的某一行的列,也能使用NEW.col_name来引用更新后的行中的列。
”
6.“触发程序不能调用将数据返回客户端的存储程序,也不能使用采用CALL语句的动态SQL(允许存储程序通过参数将数据返回触发程序)。”
7.“触发程序不能使用以显式或隐式方式开始或结束事务的语句,如START TRANSACTION、COMMIT或ROLLBACK。”
如何删除触发器:
>drop trigger tri_name;
如何导出/备份触发器:
>mysqldump.exe -u root -p --no-create-info --no-data --no-create-db --skip-opt test>tri.sql