【问题标题】:MySQL : When stored procedure parameter name is the same as table column name [continue]MySQL:当存储过程参数名称与表列名称相同时 [继续]
【发布时间】:2009-05-15 09:18:56
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: mysql stored-procedures parameters backticks


    【解决方案1】:

    我不明白为什么您首先需要使用反引号来逃避。 在语句 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。

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

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

    都具有相同的效果。

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

    【讨论】:

    • 嗯,我也无法重现 UPDATE 和 INSERT 的问题 :) 我不知道为什么.. WHERE 子句呢?我想写这样的东西:... WHERE Name = Name
    猜你喜欢
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多