好的,建立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中有会话变量并且它没有抱怨,我认为这是一种明确的方式来说“这个列等于这个变量”。
有些人可能会说“呃..当然它把它当作列=变量”,但我可以很容易地说“变量=列”。那它如何处理呢?
答案 0 :(得分:11)
MySQL的变量命名模式有点奇怪,第一次看它时。通常,MySQL区分三种类型的变量:
@@varname
@varname
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引用存储过程变量。