mysql的set语句不支持同时给多个用户变量赋值,必须逐条执行;正确批量赋值需用select...into(要求恰好一行),或在存储过程中用declare声明后分多条set赋值,用户变量作用域为session级。

MySQL 的 SET 语句不支持同时给多个用户变量赋值
直接写 SET @a = 1, @b = 2; 会报错:ERROR 1064 (42000): You have an error in your SQL syntax。MySQL 的 SET 语法只允许一次赋一个变量(或一个系统变量),逗号分隔多个赋值是无效的。这不是版本差异问题,而是语法硬性限制。
正确做法:用 SELECT ... INTO 一次性赋多个用户变量
当需要从查询结果中取值并批量赋给多个变量时,SELECT ... INTO 是唯一可靠方式。它要求查询返回**恰好一行**,否则会出错或静默截断。
SELECT col1, col2, col3 INTO @var1, @var2, @var3 FROM t WHERE id = 123;- 若字段少于变量数,未被赋值的变量保持
NULL;若字段多于变量数,多余列被忽略 - 不能用在子查询或表达式右侧,必须是独立的
SELECT语句
存储过程内可用 DECLARE + 多个 SET,但仍是逐条执行
在存储过程中,局部变量(非 @ 开头)用 DECLARE 定义后,仍需用多个 SET 分别赋值:
DECLARE v_a INT DEFAULT 0; DECLARE v_b VARCHAR(20); DECLARE v_c DATE; SET v_a = 100; SET v_b = 'hello'; SET v_c = NOW();
注意:DECLARE 支持一次声明多个变量,但赋值不能合并;DEFAULT 只用于初始化,后续修改仍需 SET。
想“拼接多个值到一个变量”?别用 SET 连续赋,用 CONCAT() 显式累积
用户变量本身不支持数组或列表,所谓“接收多个值”实际是字符串拼接。错误写法:SET @list = 'a', @list = CONCAT(@list, ',b');(第二句会覆盖第一句,且语法非法)。正确写法是每次用 CONCAT() 显式追加:
SET @list = '';SET @list = CONCAT(@list, 'value1');SET @list = CONCAT(@list, ', value2');
这种模式本质是构建 CSV 字符串,后续要用 FIND_IN_SET() 或正则匹配提取,不是真正意义上的多值变量。
@xxx)的作用域是 session 级,跨语句存在但不跨连接;而存储过程里的 DECLARE 变量只在块内有效。混用两者时,别指望 SELECT ... INTO @var 赋的值能在另一个存储过程里读到。











