MySQL的:@Variable与变量。 有什么不同? (第2部分)(MySQL: @vari

2019-10-16 14:00发布

好吧,建设关的最后一个问题,我问 ,是如何处理的Mysql在下面的代码,其中statment:

DELIMITER ;//
DROP PROCEDURE IF EXISTS `test`;//
CREATE PROCEDURE `test`
(
  id INT
)
BEGIN
  SELECT *
    FROM some_table
   WHERE id = id;
END;//

是什么的MySQL在这种情况下怎么办? 是否把where子句为

some_table.id = id

或者它像对待

some_table.id = some_table.id 

现在我做这样的事情

WHERE id = @id

因为我不知道,有在MySQL会话变量并没有抱怨,我认为这是说:“这哪里列等于该变量”的明确方式。

也许有人会说“咄..当然,它会将其作为列=变量”,但我可以很容易地说,这里的“变量=列。” 那么它是怎样处理呢?

Answer 1:

MySQL的变量命名架构是有点不可思议,有第一次看进去时。 一般的MySQL三种类型的变量之间的区别:

  • 系统变量( 全局或会话作用域): @@varname
  • 用户定义的变量(它们是会话范围): @varname
  • 局部变量中存储的程序: varname

所以命名冲突,比如你上面提到的那些,只存储程序中出现。 因此,你首先应该尝试通过指定明确的参数名称,例如,通过prefxing与参数,以避免这些命名冲突ppId 。 如果MySQL遇到模棱两可它将解释引用作为变量的名称 ( 见这里 ):

[...]本地变量名应该是不一样的列名。 如果一个SQL语句,如SELECT ... INTO语句,包含一列,并与同名的声明的局部变量的引用, 目前MySQL的解释引用作为变量的名称。 [...]

措辞目前莫名其妙地给了这种行为可能在未来版本中改变印象。



Answer 2:

我敢肯定的是,@意味着它在程序的变量,而不是引用的表列。 只有一个指定的表列id ,所以在这种情况下,它是毫不含糊的。 如果你正在做一个连接,那么你就需要给它加前缀:

select *
from table1, table2
where table1.id = @id
and table2.some_field = table1.id

不要紧,它在哪里,该变量将始终需要@前缀,如在此查询:

select id, @id
from table1

第一id是明确的表列table1.id和@id引用存储的过程变量。



文章来源: MySQL: @variable vs. variable. Whats the difference? (Part2)