mysql 变量赋值的三种方法

需要明确的是,MySQL 中为变量赋值的方法只有三种,但在正确的场景中使用它们很重要。

首先使用SET语句。
去年我们跑了一个高并发的项目,用它来大批量更新用户状态。
SET @status := 'inactive' 简单粗暴,但是注意不要使用SELECT,否则会报错。
其次,:=的使用比=更加标准化。
虽然现在很多系统都兼容了,但是有一个行话叫“显式赋值”,可以减少歧义。
还有一个更重要的细节。
例如,在存储过程中,使用SET给局部变量赋值,如SET @count:= COUNT(),但直接使用SELECT会崩溃,因为触发器无法返回结果集。

我一开始以为SET和SELECT INTO是一样的,后来发现是错误的。
SET INTO 从结果集的第一行和第一列获取值。
去年,一名新员工滥用了它并造成了数据混乱。
说实话,当时很混乱。

最后提醒:当使用SELECT INTO从表中获取多列时,如SELECT id, name INTO @uid, @uname,请注意表中的列必须是有序的,不能省略,否则只会分配第一列。
我认为值得一试。

declare 是什么意思

2 02 3 年,我的朋友刚开始学习编程,不记得如何声明变量。

他说SQL中的DECLARE关键字非常重要,可以定义变量。

我给你举个例子:“比如你想要一个变量存储一个数字,只要DECLARE variable_name INT DEFAULT value即可;”
他似乎明白了:“啊,INT是什么?”
我说:“INT是整数类型,你设置的默认值代表初始值。

他点点头:“哦,我可以随时改变这个值吗?”回答:“是的,你可以在程序中给它赋新值。

他笑了:“太方便了,以后写存储过程的时候都需要它。

我说:“确实,这段代码有效,而且没有错误。

他突然问:“那DECLARE关键字呢?只能在我的头部使用吗?”
我可以在我的头部函数和一般的SQL查询中使用。

韩若有所思, “嗯,以后写数据库操作的时候会多注意这个关键字。

我补充道,“对,正确使用D。
ECLARE可以提高代码质量。

他点点头:“我明白了,谢谢。

我说:“不客气,以后有问题就记住吧。

算了,希望他能真正记住这个关键词。

浅谈MySQL存储过程中declare和set定义变量的区别

上周,一位客户向我询问MySQL存储过程中的变量,这让我有点困惑。
读完文档后,我明白了...这两个变量确实很容易混淆。

想一想,像@var这样的会话变量就像你登录系统后跟着你的东西一样。
比如2 02 3 年我在上海某商场测试时,可以使用SET @user_id = 1 001 ; 并且在整个会话的任何地方都使用这个user_id,并且它不会自动归零或消失。
但DECLARE变量相对有限,只能在该存储过程中有效。
去年在北京调试一个订单系统存储过程的时候,我写了 DECLARE @total_price INT DEFAULT 0; 这样,手术之后就什么也没有了。

最烦人的是初始化。
请注意文档中的内容。
DECLARE的变量默认为NULL,每次调用存储过程时都必须重置该值。
但是对于像@var这样的会话变量,如果你在上次会话中将其设置为1 00,并且这次调用相同的进程,它仍然是1 00! 比如我在广州测试的时候,首先使用了SET @count = 5 ; 运行一个流程,然后两天后使用相同的流程。
@count 可能仍然是 5 ,除非您手动使用 SET @count = NULL; 清除它。

还有一个关键点你必须记住。
进行动态SQL时,必须使用会话变量。
就像 PREPARE stmt FROM @v_sql; 在您的示例中,会话变量 @v_sql 用于保存 SQL 文本。
去年我在成都写报表函数的时候,尝试过DECLARE @sql_text VARCHAR(1 000); 这种直接赋值。
结果PREPARE报错。
我花了很长时间才发现我必须使用@符号。

但是说实话,这两个变量的使用场景完全不同。
会话变量适合您在交互式查询中临时存储值。
存储的过程变量用于过程的内部算术逻辑。
想一想,如果存储过程也可以使用会话变量,那么该过程如何能够独立执行呢? 无论如何,我建议您在编写存储过程时使用DECLARE,并将会话变量留给客户端脚本或临时查询。