MySQL:当存储过程参数名与表列名相同时
假设有一个存储过程SetCustomerName,它有一个输入参数名,我有一个表customers和列名。 所以在我的存储过程中,我想设置客户的名称。如果我写MySQL:当存储过程参数名与表列名相同时,mysql,stored-procedures,parameters,Mysql,Stored Procedures,Parameters,假设有一个存储过程SetCustomerName,它有一个输入参数名,我有一个表customers和列名。 所以在我的存储过程中,我想设置客户的名称。如果我写 UPDATE customers SET Name = Name; 这是不正确的,我认为还有两种方式: UPDATE customers SET Name = `Name`; UPDATE customers SET customers.Name = Name; 第一个是可行的,但我在文档中没有发现可以将参数包装在`字符中。或者我在文档中
UPDATE customers SET Name = Name;
这是不正确的,我认为还有两种方式:
UPDATE customers SET Name = `Name`;
UPDATE customers SET customers.Name = Name;
第一个是可行的,但我在文档中没有发现可以将参数包装在`字符中。或者我在文档中遗漏了它(在这种情况下,请链接)
还有什么其他的方法,这种情况的标准方法是什么?重命名输入参数对我不好(因为我有自动对象关系映射,如果您知道我的意思的话)
更新:
因此,这里有一个关于backticks()的链接,但是没有对如何使用它们(如何将它们与参数和列名一起使用)进行足够深入的解释
还有一件非常奇怪的事情(至少对我来说):你可以用任何一种方式来使用backticks:
UPDATE customers SET Name = `Name`;
//or
UPDATE customers SET `Name` = Name;
//or even
UPDATE customers SET `Name` = `Name`;
它们的工作方式完全相同
你不觉得这很奇怪吗?这种奇怪的行为在什么地方得到解释了吗?在MySQL查询语法中使用backticks记录如下:
因此,是的,您的第一个示例(使用反勾号)是正确的。以下是您需要的链接:
在MySql中,backticks被称为“identifier quote”我认为您的第一个示例实际上是向后的。如果您试图将“Name”列设置为“Name”输入参数,我认为应该是:
UPDATE customers SET `Name` = Name;
对于第二个示例,可以使用与在所有其他语句中相同的方式设置表别名:
UPDATE customers AS c SET c.Name = Name;
区分参数和列(如果两个名称相同)的最简单方法是在列名中添加表名
UPDATE customers SET customers.Name = Name;
甚至您也可以添加数据库前缀,如
UPDATE yourdb.customers SET yourdb.customers.Name = Name;
通过添加数据库名称,可以从单个存储过程对多个数据库执行操作 这是一种方法,我知道这个答案比我老。似乎
@
不是过程参数的有效前缀,是否可以添加其他有效字符?嗯,除了$
,我也不想将这些名称与我的php变量混合使用。