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

nig*_*der 9 mysql parameters stored-procedures

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

UPDATE customers SET Name = Name;
Run Code Online (Sandbox Code Playgroud)

这是不正确的,我还看到了另外两种方式:

UPDATE customers SET Name = `Name`;
UPDATE customers SET customers.Name = Name;
Run Code Online (Sandbox Code Playgroud)

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

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

更新:

所以,有一个关于反引号的链接(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`;
Run Code Online (Sandbox Code Playgroud)

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

你觉得这不奇怪吗?这个奇怪的行为是在某处解释的吗?

小智 17

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

UPDATE customers SET customers.Name = Name;
Run Code Online (Sandbox Code Playgroud)

即使你也可以添加数据库前缀

UPDATE yourdb.customers SET yourdb.customers.Name = Name;
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢,这应该标记为答案。 (2认同)

Cha*_*rch 5

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

UPDATE customers SET `Name` = Name;
Run Code Online (Sandbox Code Playgroud)

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

UPDATE customers AS c SET c.Name = Name;
Run Code Online (Sandbox Code Playgroud)


Cod*_*lan -1

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

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

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