MySQL:@变量 vs.多变的。有什么不同?(第2部分)
-
06-07-2019 - |
题
好的,建立在 我问的最后一个问题, ,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中有会话变量,它也没有抱怨,我认为这是一种明确的方式来表达“该列等于该变量”。
有些人可能会说“呃..当然,它把它视为列=变量”,但我可以很容易地说出“变量=列”。那么它是如何处理这个问题的呢?
解决方案
乍一看,MySQL 的变量命名模式有点奇怪。一般来说,MySQL 区分三种类型的变量:
因此,诸如上面提到的命名冲突只会出现在存储的程序中。因此,您首先应该尝试通过分配明确的参数名称来避免这些命名冲突,例如通过在参数前面添加前缀 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引用存储过程变量。
不隶属于 StackOverflow