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

Допустим, у меня есть хранимая процедура SetCustomerName, у которой есть входной параметр 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`;

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

Вам не кажется это странным? Это странное поведение где-то объясняется?


person nightcoder    schedule 15.05.2009    source источник


Ответы (1)


Я не понимаю, почему вам нужно избегать использования обратных кавычек в первую очередь. В операторе UPDATE 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. .

Вы уверены, что клиенты UPDATE SET Name = Name; выдает ошибку? С учетом приведенного выше объяснения кажется логичным, что

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

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

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

person rodion    schedule 03.06.2009
comment
Хм, я тоже больше не могу воспроизвести проблему с UPDATE и INSERT :) Не знаю почему.. А как насчет предложения WHERE? То, что я хочу написать примерно так: ... ГДЕ Имя = Имя - person nightcoder; 07.06.2009