在我发布的另一个问题中,有人告诉我:

@variable

以及:

variable

在MySQL中.他还提到了MSSQL的批处理范围和MySQL的会话范围.有人能给我详细解释一下吗?

推荐答案

MySQL的概念是100.

它们是松散类型的变量,可以在会话中的某个位置初始化,并在会话结束前保持其值.

它们的前面有一个@的标志,比如:@var

可以使用SET语句或在查询中初始化此变量:

SET @var = 1

SELECT @var2 := 2

在MySQL中开发存储过程时,可以传递输入参数并声明局部变量:

DELIMITER //

CREATE PROCEDURE prc_test (var INT)
BEGIN
    DECLARE  var2 INT;
    SET var2 = 1;
    SELECT  var2;
END;
//

DELIMITER ;

这些变量没有任何前缀.

过程变量和特定于会话的用户定义变量之间的区别在于,每次调用过程时,过程变量都会重新初始化为NULL,而特定于会话的变量不会:

CREATE PROCEDURE prc_test ()
BEGIN
    DECLARE var2 INT DEFAULT 1;
    SET var2 = var2 + 1;
    SET @var2 = @var2 + 1;
    SELECT  var2, @var2;
END;

SET @var2 = 1;

CALL prc_test();

var2  @var2
---   ---
2     2


CALL prc_test();

var2  @var2
---   ---
2     3


CALL prc_test();

var2  @var2
---   ---
2     4

如您所见,每次调用过程时,都会重新初始化var2(过程变量),而不是@var2(会话特定变量).

(除了用户定义的变量外,MySQL also还有一些预定义的"系统变量",可能是"全局变量",比如@@global.port,也可能是"会话变量",比如@@session.sql_mode;这些"会话变量"与特定于会话的用户定义变量无关.)

Mysql相关问答推荐

Select 一对列存在最短日期的记录列

我可以在插件中访问SQL密钥对吗?

慢查询日志(log)甚至包括快速查询,因为它包括等待锁定所花费的时间

如何在Sequelize中创建限制查询?

根据当前表列的值,从SQL中的另一个表中获取数据

使用MySQL工作台导出具有数据的数据库表并导入到其字段具有不同数据类型的同一表中

MySQL:返回所有条件(但不满足其他条件)为真的所有结果

为什么MySQL不考虑在联接中使用(JSON)函数索引,而考虑在生成的列上使用索引?

PythonAnywhere中SSH到MySQL数据库无限期挂起,SSH正确,workbench可以完美连接

使用Workbench时如何添加mysqldump配置标志

多列分组并进行求和

从 2 个不同的表中获取数据并将它们加入 sql

如何使用 laravel 连接 mysql?

如何在 MySQL 中搜索多个列?

MySQL:使用来自查询的信息创建一个新表

MySql 以秒为单位的两个时间戳之间的差异?

WHERE 子句中的条件顺序会影响 MySQL 性能吗?

使用 mysqldriver 连接数据库时出错

带有 LIKE 运算符的 Select 语句中的 MySQL case

BIGINT mysql 性能与 INT 相比