mysql : @variable 대 변수. 차이점이 뭐야? (2 부)
-
06-07-2019 - |
문제
좋아, 건물 내가 묻는 마지막 질문, MySQL은 다음 코드에서 WHERE 진술을 어떻게 처리합니까?
DELIMITER ;//
DROP PROCEDURE IF EXISTS `test`;//
CREATE PROCEDURE `test`
(
id INT
)
BEGIN
SELECT *
FROM some_table
WHERE id = id;
END;//
이 경우 MySQL은 무엇을합니까? WHERE 절을 처리합니까?
some_table.id = id
아니면처럼 취급합니까?
some_table.id = some_table.id
지금 나는 같은 일을하고 있습니다
WHERE id = @id
MySQL에 세션 변수가 있다는 것을 몰랐고 불평하지 않았으며 "이 열 이이 변수와 같은 곳"이라고 말하는 명백한 방법이라고 생각했습니다.
어떤 사람들은 "duh .. 물론 그것을 열 = 변수로 취급한다"고 말할 수도 있지만 "variable = column"을 쉽게 말할 수있었습니다. 그렇다면 어떻게 처리합니까?
해결책
MySQL의 변수 명명 스키마는 처음으로 살펴볼 때 약간 이상합니다. 일반적으로 MySQL은 세 가지 유형의 변수를 구분합니다.
따라서 위에서 언급 한 것과 같은 명명 충돌은 저장된 프로그램 내에서만 발생합니다. 따라서 먼저 매개 변수를 조리하여 명백한 매개 변수 이름을 할당하여 이러한 이름 지정 충돌을 피해야합니다. p
~와 같은 pId
. MySQL이 모호성을 만나면 참조를 변수의 이름으로 해석합니다. (여기를 봐):
...] 로컬 변수 이름은 열 이름과 같지 않아야합니다. a와 같은 SQL 문인 경우
SELECT ... INTO
문, 열에 대한 참조와 동일한 이름의 선언 된 로컬 변수가 포함되어 있습니다. MySQL은 현재 참조를 변수의 이름으로 해석합니다. [...]
문구 현재 어쨌든이 동작이 미래 버전에서 변경 될 수 있다는 인상을줍니다.
다른 팁
나는 @가 테이블 열을 참조하기보다는 절차의 변수임을 의미한다고 확신합니다. 이름이 하나만이 있습니다 id
,이 경우에는 모호하지 않습니다. 가입을하고 있다면 접두사가 필요합니다.
select *
from table1, table2
where table1.id = @id
and table2.some_field = table1.id
이 쿼리에서와 같이 변수는 항상 @ prefix가 필요합니다.
select id, @id
from table1
첫 번째 ID는 명확하지 않은 테이블 열 표 1.ID이며 @ID는 저장 프로 시저 변수를 참조합니다.