假设有一个存储过程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`;
他们都以同样的方式工作。
你不觉得这很奇怪吗?是否在某处解释了这种奇怪的行为?答案 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