2014-09-03 67 views
0

嗨,大家好我在觸發器的某個位置有以下代碼。 (INSERT AFTER觸發器)MySQL TRIGGER奇怪的行爲

DECLARE Interv int; 

在某些時候我使用下面的代碼:

SELECT myfield FROM TABLE WHERE interv=new.interv 

但顯然mysql的混淆了兩個變量的值(NEW.INTERV AND INTERV)和鴕鳥政策返回我正確的查詢的價值。

但是,如果我使用DECLARE Interv_Value int而不是DECLARE Interv int問題SELECT工作正常。

任何想法?我正在使用MySQL 5.1.68。

+1

你的桌子實際上有'interv'字段嗎?如果是這樣,那麼難怪mysql會感到困惑。如果您將變量命名爲與表字段相同,那麼實際字段將優先於相同名稱的變量。 – 2014-09-03 14:45:43

回答

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

謝謝,現在工作正常! – 2014-09-03 16:33:06