2014-09-03 5 views
0

Привет, ребята У меня есть следующий код в какой-то момент моего триггера. (ПОСЛЕ ВСТАВКИ TRIGGER)MySQL TRIGGER странное поведение

DECLARE Interv int; 

В какой-то момент я использую следующий код:

SELECT myfield FROM TABLE WHERE interv=new.interv 

Но видимо MySQL путает значение двух переменных (NEW.INTERV AND INTERV) и don't возвращает мне значение соответствующего запроса в.

Но, если я использую DECLARE Interv_Value int вместо DECLARE Interv intSELECT в вопросе работает отлично.

Любые идеи? Я использую MySQL 5.1.68.

+1

В вашей таблице есть поле 'interv'? Если это так, то неудивительно, что mysql запутывается. если вы именовали переменные так же, как и поля таблицы, то фактические поля будут иметь приоритет над переменной с тем же именем. –

ответ

0

Что с этим связано?

Если у вас есть запрос:

SELECT myfield 
FROM TABLE 
WHERE interv = new.interv; 

Тогда MySQL должен выяснить, где все неквалифицированные имена берутся. У него есть некоторые правила. В этом случае:

- First look at the columns in the `FROM` clause. 
- Then it look in the environment 

(Это фактически обзорного правила, а также включать в себя подзапросы.) Таким образом, запрос интерпретируется как:

SELECT myfield 
FROM TABLE 
WHERE table.interv = new.interv; 

Как правило, писать свои запросы с помощью таблицы псевдонимов укажите, откуда взялись столбцы. Поэтому указанный выше запрос может быть записан как:

SELECT myfield 
FROM TABLE t 
WHERE t.interv = new.interv; 

Хотя вы действительно не хотите эту версию.

Если вы хотите использовать переменные, используйте переменные, заданные пользователем, с помощью @ или укажите имена переменных, которые вряд ли будут конфликтующими с именами столбцов (для этого я использую префиксы v_).

+0

Спасибо, теперь работает отлично! –

Смежные вопросы