好吧,建设关的最后一个问题,我问 ,是如何处理的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会话变量并没有抱怨,我认为这是说:“这哪里列等于该变量”的明确方式。
也许有人会说“咄..当然,它会将其作为列=变量”,但我可以很容易地说,这里的“变量=列。” 那么它是怎样处理呢?
MySQL的变量命名架构是有点不可思议,有第一次看进去时。 一般的MySQL三种类型的变量之间的区别:
- 系统变量( 全局或会话作用域):
@@varname
- 用户定义的变量(它们是会话范围):
@varname
- 局部变量中存储的程序:
varname
所以命名冲突,比如你上面提到的那些,只存储程序中出现。 因此,你首先应该尝试通过指定明确的参数名称,例如,通过prefxing与参数,以避免这些命名冲突p
如pId
。 如果MySQL遇到模棱两可它将解释引用作为变量的名称 ( 见这里 ):
[...]本地变量名应该是不一样的列名。 如果一个SQL语句,如SELECT ... INTO
语句,包含一列,并与同名的声明的局部变量的引用, 目前MySQL的解释引用作为变量的名称。 [...]
措辞目前莫名其妙地给了这种行为可能在未来版本中改变印象。
我敢肯定的是,@意味着它在程序的变量,而不是引用的表列。 只有一个指定的表列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)