MySQL: когда имя параметра хранимой процедуры совпадает с именем столбца таблицы [продолжить] - PullRequest
2 голосов
/ 15 мая 2009

Допустим, у нас есть хранимая процедура SetCustomerName, у которой есть входной параметр Name, и у меня есть таблица клиентов со столбцом Name. Поэтому внутри моей хранимой процедуры я хочу установить имя клиента. Если я напишу

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

и все они работают абсолютно одинаково.

Тебе не кажется, что это странно? Это странное поведение объяснено где-то?

1 Ответ

2 голосов
/ 03 июня 2009

Я не понимаю, зачем вам в первую очередь бежать с помощью обратных галочек. В операторе ОБНОВЛЕНИЕ 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)

Как видите, столбец таблицы комментариев content обновляется, хотя content также является именем параметра хранимой процедуры foo .

Вы уверены, что для ОБНОВЛЕНИЯ клиентов SET Name = Name; выдает ошибку? Из приведенного выше объяснения кажется логичным, что

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

все имеют одинаковый эффект.

Редактировать: Конечно, для операторов SELECT ситуация будет иной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...