1

好的,基于我问的最后一个问题,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 中有会话变量并且它没有抱怨,我认为这是一种明确的方式来表示“此列等于此变量的位置”。

有些人可能会说“duh .. 当然它把它当作 column = variable”,但我可以很容易地说 where “variable = column”。那么它是如何处理这个问题的呢?

4

2 回答 2

11

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

所以命名冲突,比如你上面提到的那些,只出现在存储程序中。因此,您首先应该尝试通过分配明确的参数名称来避免这些命名冲突,例如通过在参数前面加上p诸如pId. 如果 MySQL 遇到歧义,它会将引用解释为变量的名称请参见此处):

[...] 局部变量名称不应与列名称相同。如果一条 SQL 语句,例如SELECT ... INTO 语句,包含对列的引用和同名的已声明局部变量,则MySQL 当前将该引用解释为变量的名称。[...]

当前的措辞以某种方式给人一种印象,即这种行为可能会在未来的版本中发生变化。

于 2009-06-18T06:13:20.737 回答
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 引用存储过程变量。

于 2009-06-18T02:00:38.377 回答