2


0

入力パラメータNameを持つストアドプロシージャSetCustomerNameがあり、列Nameを持つテーブルcustomersがあるとします。 だから私のストアドプロシージャの中に私は顧客の名前を設定したいです。 書くなら

UPDATEのお客様SET Name = Name;

これは間違っていて、私は(例えば)書く必要があります

顧客を更新するSET `Name` = Name;

そのため、バッククォートに関するリンク(http://dev.mysql.com/doc/refman/5.0/en/identifiers.html)がありますが、それらの使い方(パラメータと列での使い方)については十分に説明されていません。名前)。

そして、(少なくとも私にとっては)非常に奇妙なことがあります。

顧客の更新SET Name = `Name`;
//or
顧客を更新するSET `Name` = Name;
//or even
顧客の更新SET `Name` =` Name`;

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

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

1 Answer


2


そもそもなぜあなたがバッククォートを使って逃げる必要があるのか​​私は理解していません。 ステートメント_UPDATE x SET a = b_では、_a_は常に_x_の列を参照する必要があります。 ただし、_b_は変数または列のどちらでもかまいません。 ローカルスコープと変数解決がストアドプロシージャ内でどのように機能するかを考えると、_b_は常にローカル変数を参照します。 _x_に同じ名前の列が存在します。

したがって、私はあなたの問題を再現することができません。 私はこのようにしてみました:

mysql> SELECT * FROMコメント。 ---- ----------- ---------
| id | parent_id | content |
---- ----------- ---------
|  1 |         0 | bar     |
|  2 |         0 | baz     |
---- ----------- --------- 2行セット(0.00秒)mysql> delimiter // mysql> CREATE PROCEDURE foo(コンテンツテキスト内) - > BEGIN - > UPDATEコメントSETコンテンツ=コンテンツ。 - > END //クエリOK、影響を受けた0行(0.00秒)mysql> delimiter。 mysql> CALL foo( '変更された!');クエリOK、影響を受けた2行(0.00秒)mysql> SELECT * FROMコメント。 ---- ----------- ----------
| id | parent_id | content  |
---- ----------- ----------
|  1 |         0 | changed! |
|  2 |         0 | changed! |
---- ----------- ----------セット内に2行(0.00秒)

ご覧のとおり、_content_はストアドプロシージャ_foo_のパラメータの名前でもありますが、comment-tableの列_content_は更新されます。

UPDATEの顧客はSET Name = Nameであることを確認していますか。あなたにエラーを与える? 上記の説明では、論理的に思えます。

顧客の更新SET Name = `Name`;顧客を更新するSET `Name` = Name;顧客の更新SET `Name` =` Name`;

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

*編集:*状況はSELECT文ではもちろん異なるでしょう。