好的,建立在 我问的最后一个问题, ,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引用存储过程变量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top