2

入力パラメーター Name を持つストアド プロシージャ SetCustomerName があり、列 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`;

それらはすべてまったく同じように機能します。

これって変だと思いませんか?この奇妙な動作はどこかで説明されていますか?

4

1 に答える 1

2

そもそもバックティックを使用してエスケープする必要がある理由がわかりません。ステートメントUPDATE x SET a = bでは、aは常にxの列を参照する必要があります。ただし、 bは変数または列のいずれかです。ストアド プロシージャでローカル スコープと変数解決がどのように機能するかを考えると、 xに同じ名前の列が存在する場合でも、bは常にローカル変数を参照します。

したがって、問題を再現できません。私はこの方法を試しました:

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 customers SET Name = Name; でよろしいですか。あなたにエラーを与えますか?上記の説明で、論理的に思えるのは

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

すべて同じ効果があります。

編集:もちろん、SELECTステートメントの場合は状況が異なります。

于 2009-06-03T00:21:21.507 に答える