最近在使用存储过程定时创建分区的时候,运行时经常报错,原因都是因为变量的定义或者赋值问题导致的,在此记录一下MySQL的变量定义及赋值,方便自己和大家查阅,各位看到此博客的小伙伴,如有不对的地方请及时通过私信我或者评论此博客的方式指出,以免误人子弟。多谢!
另外,这是一个系列文章,最终我们将实用MySQL定时器和存储过程,实现定时自动创建分区功能,这是在此之前需要掌握的知识点,感兴趣的敬请关注。
目录
局部变量
声明变量
变量赋值
用户变量
变量赋值
系统变量
查看变量
修改变量
通常用在存储过程或函数中,定义在 begin and之间。
DECLARE var_name[,...] type [DEFAULT value]
DECLARE:声明变量的关键字。
var_name:变量的名称,可同时定义多个。
type:变量数据类型。
DEFAULT value:为变量定义默认值,默认值为NULL。
示例:
定义一个变量 a ,数据类型为 int ,默认值为 0:
declare a int default value 0;
方式一:使用 set 关键字赋值。
SET var_name = expr[,var_name = expr]...
set:变量赋值关键字。
var_name: 变量的名称;
expr: 赋值表达式。
注意:一个 SET 语句可以同时为多个变量赋值,各个变量的赋值语句之间用逗号隔开。
示例:
将变量 a 赋值为10:
set a=10;
方式二:使用 SELECT ... INTO 赋值。
SELECT col_name [...] INTO var_name[,...]
FROM table_name WEHRE condition
col_name: 查询的字段名称。
var_name: 变量的名称。
table_name: 参数指表的名称。
condition: 指查询条件。
注意:将查询结果赋值给变量时,该查询语句的返回结果只能是单行。
示例:
从 t_user 表中查询id为2的记录,将该记录的 user_name 赋值给变量 uname:
select user_name into uname from t_user where id = 2;
详情见官网 User-Defined Variables
用户变量无需声明,直接赋值即可。用户变量名不区分大小写。名称的最大长度为64个字符。
方式一:使用 SET 赋值。
可以使用形如 set @变量名=变量值 或者 set@变量名:=变量值 的方式赋值。
SET @var_name = expr [, @var_name = expr] ...
或
SET @var_name := expr [, @var_name := expr] ...
示例:
SET @a=1,@b=2;
SELECT @a,@b;
查询结果如下:
方式二:使用 SELECT 赋值。
select @变量名:=变量值
select @变量名:=字段名 from table where ... limit 1;
示例:
SELECT @a:=1,@b:=2 AS b;
SELECT @a,@b;
示例:
现有表 t_user :
SELECT @a:=user_name FROM t_user WHERE id =1;
查询结果如下:
再看如下语句:
SELECT @a:=user_name FROM t_user WHERE age =18;
查询结果如下:
注意: 通过查询表给变量赋值时,需保证查询结果只有一条记录,如上这种查询除了三条,最好在查询后进行 limit 操作。
更多示例:
SET @t1=1, @t2=2, @t3:=4;
SELECT @t1, @t2, @t3, @t4 := @t1+@t2+@t3;
SET @a=1;
SET @a = @a + 1;
SELECT @a;
SET @a=1;
SELECT @a, @a:=@a+1
像我们使用MySQL定时器一样,首先我们使用 SHOW VARIABLES LIKE '%event_sche%'; 查看是否开启了定时器支持,这里我们查的就是 系统变量,准确来说是系统变量中的 全局变量(GLOBAL)。
GLOBAL全局变量在MySQL启动时由服务器自动初始化默认值,这些默认值可通过MySQL的配置文件my.cnf进行更改。临时性修改可以直接使用 set 进行设置,但是重启服务后会设置失效。
SESSION类型会话变量在每一次建立新链接是初始化,作用域与用户变量一样,仅限于当前连接。
方式一:使用 SHOW VARIABLES 语句或变量名。
以查看是否自动提交为例:
SHOW VARIABLES LIKE '%autocommit';
显示所有会话变量:
show [session] variables;
其实session不管带不带,默认查询的都是会话变量。
显示所有全局变量:
show global variables;
方式二:使用 SELECT @@。
以查看是否自动提交为例:
SELECT @@autocommit;
修改全局变量:
以修改是否自动提交为例:
SET GLOBAL autocommit=1;
SET @@global.autocommit=1;
修改会话变量:
SET autocommit=1;
SET SESSION autocommit=1;
SET @@global.autocommit=1;