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

时间:2009-06-18 01:51:18

标签: mysql variables session-scope

好的,建立the last question I asked,Mysql如何处理以下代码中的where语句:

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中有会话变量并且它没有抱怨,我认为这是一种明确的方式来说“这个列等于这个变量”。

有些人可能会说“呃..当然它把它当作列=变量”,但我可以很容易地说“变量=列”。那它如何处理呢?

2 个答案:

答案 0 :(得分:11)

MySQL的变量命名模式有点奇怪,第一次看它时。通常,MySQL区分三种类型的变量:

  • 系统变量(globalsession作用域范围):@@varname
  • user defined个变量(它们是会话作用域):@varname
  • 存储程序中的
  • local个变量:varname

因此,命名冲突(例如上面提到的冲突)仅出现在存储的程序中。因此,您首先应该尝试通过分配明确的参数名称来避免这些命名冲突,例如:通过使用p预先填充参数,例如pId。如果MySQL遇到歧义,它会将引用解释为变量的名称see here):

  

[...]局部变量名称不应该   与列名相同。如果是SQL   声明,例如SELECT ... INTO   声明,包含对a的引用   列和声明的局部变量   同名, MySQL目前   将引用解释为名称   变量。 [...]

目前的措辞不知何故给人的印象是此行为可能会在将来的版本中发生变化。

答案 1 :(得分:0)

我很确定@表示它是过程中的变量,而不是引用表列。只有一个名为id的表列,因此在这种情况下它是明确的。如果你正在进行连接,那么你需要加上前缀:

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

无论在何处,变量总是需要@前缀,如此查询中所示:

select id, @id
from table1

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