2009-10-07 347 views
2

知道爲什麼這無法在MySQL 5.1:MySQL的SELECT INTO OUTFILE和用戶定義的變量

SET @LOAD_TIME = UNIX_TIMESTAMP(); 
SET @OUTFILE = CONCAT(CONCAT('/tmp/outfile_', @LOAD_TIME), '.sql'); 

SELECT * 
FROM `tableA` 
INTO OUTFILE @OUTFILE; 

它是MySQL的SELECT還是我失去的東西在這裏的限制?

回答

5

你不能使用變量作爲文件名。像LIMIT一樣,它必須是一個文字值,而不是公式或變量。

例如,文件將被寫入這裏的文件名是什麼?

SET @LOAD_TIME = UNIX_TIMESTAMP(); 
SET @OUTFILE = CONCAT(CONCAT('/tmp/outfile_', @LOAD_TIME), '.sql'); 

SELECT @OUTFILE = columnA 
, columnB 
FROM `tableA` 
INTO OUTFILE @OUTFILE; 

這是一個類似的LIMIT限制。如果在LIMIT子句中允許表達式,則可以提出具有不可預知行爲的查詢。例如,假設您有一個包含10行的表,並且列a的值爲1到10.此查詢的輸出是什麼?

SELECT * 
    FROM myTable 
ORDER 
    BY a 
LIMIT 10 - a 

這個限制的依據是:如果你可以計算出極限,那麼你應該明確地計算限制,然後建立與文字值的查詢。允許評估像10 - a這樣的表達式使得查詢執行計劃潛在地更復雜。

+0

如果沒有人回覆,我會將其標記爲回答,但我想知道爲什麼。它的定義是如此還是僅僅是執行的一個怪癖? – James 2009-10-08 23:18:12

+0

我已經擴展了我的答案以解釋原因。 – longneck 2009-10-09 14:37:54

+0

謝謝。這解釋了它。 – James 2009-10-13 21:43:19