我不明白为什么你首先需要使用反引号来逃避。在语句UPDATE x SET a = b中,a必须始终引用x的列。但是b可以是变量或列。鉴于本地范围和变量解析在存储过程中的工作方式,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)
如您所见,注释表的列内容得到更新,即使内容也是存储过程foo的参数名称。
你确定 UPDATE 客户 SET Name = Name; 给你一个错误?有了上面的解释,似乎合乎逻辑
UPDATE customers SET Name = `Name`;
UPDATE customers SET `Name` = Name;
UPDATE customers SET `Name` = `Name`;
都具有相同的效果。
编辑:当然,SELECT 语句的情况会有所不同。