MySQL : When stored procedure parameter name is the same as table column name [continue]

标签 mysql stored-procedures parameters backticks

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

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`;

而且它们的工作方式完全相同。

你不觉得这很奇怪吗?这种奇怪的行为是否在某处得到了解释?

最佳答案

我不明白为什么你首先需要使用反引号来转义。 在语句 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 得到了更新,即使 content 也是存储过程 foo< 的参数名称/em>.

你确定 UPDATE customers SET Name = Name;给你一个错误? 有了上面的解释,似乎合乎逻辑的是

UPDATE customers SET Name = `Name`;
UPDATE customers SET `Name` = Name;
UPDATE customers SET `Name` = `Name`;

都是一样的效果。

编辑:当然,SELECT 语句的情况会有所不同。

关于MySQL : When stored procedure parameter name is the same as table column name [continue],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/867709/

相关文章:

mysql - 合并两个具有不均匀列的 mysql 查询

MySQL Regexp,忽略括号内的字母

stored-procedures - ODP.net托管驱动程序引发ORA-12570:网络 session :意外的数据包读取错误

javascript - Angular js $state.go 参数不起作用

mysql - 更新多行

php - 将使用路径更新列的触发器

sql - 需要一个工具来自动缩进和格式化 SQL Server 存储过程

database - 从 Oracle 11g 中给定的 url 下载文件并将其保存到 blob 类型列中的过程

arrays - VB.NET数组参数机制,byval和byref

swift - 使用 `self` 作为默认参数