2009-06-18 24 views
1

好,建設關中the last question I asked,如何Mysql的處理在下面的代碼,其中statment:MySQL:@variable與變量。有什麼不同? (第2部分)

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中,它沒有抱怨,我認爲這是一個明確的方式來說「這個列等於這個變量」。

有人可能會說「當然,它把它當作列=變量」,但我可以很容易地說「變量=列」在哪裏。那麼它如何處理呢?

回答

11

MySQL的變量命名模式有一點奇怪,當有第一次查看它。一般MySQL的區分類型三者之間的變量:

  • 系統變量(globalsession作用域):@@varname
  • user defined變量(它們是會話範圍):@varname
  • local變量中存儲的程序:varname

因此,命名衝突(例如上面提到的衝突)只會在存儲的程序中出現。因此,您應該首先嚐試通過分配明確的參數名稱來避免這些命名衝突,例如,通過與p(例如pId)預參數。如果MySQL遇到模棱兩可將解釋爲參考的變量see here)名稱:

[...]本地變量名不應 是相同的列名。如果一個SQL語句 如SELECT ... INTO 聲明,包含對 柱和聲明的局部變量 具有相同名稱的引用,的MySQL目前 解釋引用作爲名稱的變量的 。 [...]

措辭目前某種程度上給人的印象,這種行爲可能在未來的版本中改變。

0

我很確定@表示它是過程中的變量,而不是引用表列。只有一個名爲id的表格列,所以在這種情況下它是明確的。如果你正在做一個連接,那麼你就需要給它加前綴:

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

不要緊,它在哪裏,該變量將始終需要@前綴,如在此查詢:

select id, @id 
from table1 

第一個id是無歧義的表列table1.id,而@id引用了存儲過程變量。

+0

我不確定這是否正確。看看我在這個問題中引用的另一個問題。回答這個問題的人表示@只是表示會話變量。 – DJTripleThreat 2009-06-18 07:40:34

相關問題