문제

좋아, 건물 내가 묻는 마지막 질문, 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는 저장 프로 시저 변수를 참조합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top