假设有一个存储过程SetCustomerName,它有一个输入参数Name,我有一个表名为customer的客户。所以在我的存储过程中,我想设置客户的名字。如果我写
UPDATE customers SET Name = Name;
这是不正确的,我必须写(例如)
UPDATE customers SET `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 :(得分:2)
我不明白为什么你需要首先使用反引号逃脱。 在语句 UPDATE x SET a = b 中, a 必须始终引用 x 列。 b 但可以是变量或列。鉴于local scope and variable resolution works in stored procedures, b 将始终引用局部变量,即使 x 中存在同名的列。
因此,我无法重现您的问题。我试过这种方式:
mysql> SELECT * FROM comments;
+----+-----------+---------+
| id | parent_id | content |
+----+-----------+---------+
| 1 | 0 | bar |
| 2 | 0 | baz |
+----+-----------+---------+
2 rows in set (0.00 sec)
mysql> delimiter //
mysql> CREATE PROCEDURE foo(IN content TEXT)
-> BEGIN
-> UPDATE comments SET content = content;
-> END //
Query OK, 0 rows affected (0.00 sec)
mysql> delimiter ;
mysql> CALL foo('changed!');
Query OK, 2 rows affected (0.00 sec)
mysql> SELECT * FROM comments;
+----+-----------+----------+
| id | parent_id | content |
+----+-----------+----------+
| 1 | 0 | changed! |
| 2 | 0 | changed! |
+----+-----------+----------+
2 rows in set (0.00 sec)
如您所见,即使 content 也是存储过程 foo < / em>的
您确定UPDATE客户SET Name = Name;给你一个错误? 通过上面的解释,似乎合乎逻辑
UPDATE customers SET Name = `Name`;
UPDATE customers SET `Name` = Name;
UPDATE customers SET `Name` = `Name`;
都具有相同的效果。
编辑:当然,SELECT语句的情况会有所不同。