MySQL:当存储过程参数名称与表列名称相同时

时间:2009-05-14 22:19:08

标签: mysql stored-procedures parameters

假设有一个存储过程SetCustomerName,它有一个输入参数Name,我有一个表名为customer的客户。 所以在我的存储过程中,我想设置客户的名字。如果我写

UPDATE customers SET Name = Name;

这是不正确的,我还有其他两种方式:

UPDATE customers SET Name = `Name`;
UPDATE customers SET customers.Name = Name;

第一个可以工作,但我没有在文档中找到我可以在`字符中包装参数。或者我在文档中遗漏了它(在这种情况下链接很受欢迎)。

还有哪些其他方式以及这种情况的标准方式是什么?重命名输入参数对我不利(因为如果你知道我的意思,我有自动对象关系映射)。

更新

所以,有一个关于反引号的链接(http://dev.mysql.com/doc/refman/5.0/en/identifiers.html)但是没有深入解释如何使用它们(如何将它们与参数和列名一起使用)。

还有一件非常奇怪的事情(至少对我来说):你可以用任何一种方式使用反引号:

UPDATE customers SET Name = `Name`;
//or
UPDATE customers SET `Name` = Name;
//or even
UPDATE customers SET `Name` = `Name`;

他们都以同样的方式工作。

你不觉得这很奇怪吗?是否在某处解释了这种奇怪的行为?

5 个答案:

答案 0 :(得分:16)

区分参数和列的最简单方法(如果两个名称相同)是在列名中添加表名。

UPDATE customers SET customers.Name = Name;

即使您也可以添加数据库前缀,如

UPDATE yourdb.customers SET yourdb.customers.Name = Name;

通过添加数据库名称,您可以从单个存储过程对多个数据库执行操作。

答案 1 :(得分:5)

我认为你的第一个例子实际上是倒退。如果您尝试将“名称”列设置为“名称”输入参数,我相信它应该是:

UPDATE customers SET `Name` = Name;

对于第二个示例,您可以像在所有其他语句中一样设置表别名:

UPDATE customers AS c SET c.Name = Name;

答案 2 :(得分:1)

在MySQL中使用反引号查询语法如下:

http://dev.mysql.com/doc/refman/5.0/en/identifiers.html

所以是的,你的第一个例子(使用反引号)是正确的。

答案 3 :(得分:1)

以下是您要求的链接: http://dev.mysql.com/doc/refman/5.0/en/identifiers.html 反引号在MySql中称为“标识符引用”

答案 4 :(得分:-2)

或使用类似的东西:

BEGIN
set @m_query = concat('update users set ',column,' = \'', value,'\' where id = ',user);

prepare stmt from @m_query;
execute stmt;

END 

专栏&值是TEXT 用户是INT