MySQL: @variable против переменной. Какая разница? (Часть 2) - PullRequest
1 голос
/ 18 июня 2009

Хорошо, построение из последнего вопроса, который я задал , Как 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 были переменные сеанса, и он не жаловался, и я подумал, что это явный способ сказать, «где этот столбец равен этой переменной».

Кто-то может сказать: "Да ... конечно, он воспринимает это как column = variable", но я легко мог бы сказать, где "variable = column". Так как же это с этим справиться?

Ответы [ 2 ]

11 голосов
/ 18 июня 2009

Схема именования переменных в MySQL выглядит немного странно, когда вы впервые на нее смотрите. Обычно MySQL различает три типа переменных:

Таким образом, конфликты имен, такие как упомянутые выше, возникают только в хранимых программах. Поэтому сначала вы должны попытаться избежать этих конфликтов имен, назначая однозначные имена параметров, например, с помощью префикса параметров p, например pId. Если MySQL встречает неоднозначность , он будет интерпретировать ссылку как имя переменной ( см. Здесь ):

[...] Имена локальных переменных не должны быть таким же, как имена столбцов. Если SQL заявление, такое как SELECT ... INTO заявление, содержит ссылку на столбец и объявленная локальная переменная с тем же именем, MySQL в настоящее время интерпретирует ссылку как имя переменной. [...]

Формулировка в настоящее время каким-то образом создает впечатление, что это поведение может измениться в будущих версиях.

0 голосов
/ 18 июня 2009

Я уверен, что @ означает, что это переменная в процедуре, а не ссылка на столбец таблицы. Существует только один столбец таблицы с именем id, поэтому в этом случае он однозначен. Если вы выполняете объединение, вам необходимо добавить префикс:

select *
from table1, table2
where table1.id = @id
and table2.some_field = table1.id

Неважно, где она находится, для переменной всегда требуется префикс @, как в этом запросе:

select id, @id
from table1

первый идентификатор - это однозначный столбец таблицы table1.id, а @id ссылается на переменную хранимой процедуры.

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