2009-05-15 3 views
2

입력 매개 변수 이름이있는 저장 프로 시저 SetCustomerName을 가지고 있고 열 이름이있는 고객이 있습니다. 그래서 내 저장된 프로 시저 내에서 고객의 이름을 설정하고 싶습니다. 내가MySQL : 저장 프로 시저 매개 변수 이름이 테이블 열 이름과 동일 할 때

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

을 그들은 모두 절대적으로 동일한 방식으로 작동합니다.

이상하다고 생각하지 않습니까? 이 이상한 행동이 어딘가에 설명되어 있습니까?

답변

2

왜 처음부터 역 따옴표를 사용하여 탈출해야하는지 이해가되지 않습니다. 명세서에 업데이트 x 세트 a = b, 은 항상 x의 열을 참조해야합니다. b 그러나 변수 또는 열 중 하나 일 수 있습니다. 주어진 local scope and variable resolution works in stored procedures의 경우 x에 같은 이름의 열이있는 경우에도 b은 항상 로컬 변수를 참조합니다.

따라서 문제를 재현 할 수 없습니다. 내용 또한 저장 프로 시저 foo는의 매개 변수의 이름에도 불구하고,

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) 

당신이 볼 수 있듯이, 주석 테이블의 컬럼 내용이 업데이트 될 때 :이 방법을 시도했다.

업데이트 고객 SET Name = Name; 당신에게 오류가 있습니까? 위의 설명과 ,

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

모두 같은 효과를 가지고 논리적 인 것 같다.

편집 : 상황은 SELECT 문과 다를 수 있습니다.

+0

흠, 나는 UPDATE와 INSERT 중 하나를 사용하여 문제를 재현 할 수 없다. 왜 그런지 모르겠다. WHERE 절은 어떻습니까? 다음과 같이 쓰고 싶습니다 : ... WHERE Name = Name – nightcoder

관련 문제