2016-01-21 37 views
0

我想讀取一個csv文件並將行插入到表中。當我分配值時,我可以插入它們而沒有任何問題。但是當我嘗試使用@user變量時,同樣的sql停止工作。mysql infile無法訪問子查詢中的@user變量

所有幫助表示讚賞。

這工作:

LOAD DATA INFILE 'tmp/test.csv' 

INTO TABLE T1 

FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(@var1) 
set create_timestamp = now(), 
col1 = (select max(id) from T2 where 
col2 = 1234); 

這不起作用:

LOAD DATA INFILE 'tmp/test.csv' 

INTO TABLE T1 

FIELDS TERMINATED BY ',' 
OPTIONALLY ENCLOSED BY '"' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(@var1) 
set create_timestamp = now(), 
col1 = (select max(id) from T2 where 
col2 = @var1); 
+1

「不起作用」是什麼意思? –

+0

問題發生在子查詢中,在這裏它無法訪問用戶變量@ var1。 子查詢的作品,當我給它一個恆定的值,如1234. – Aniks

+1

@Anika。 。 。它正在產生一個錯誤。如果是這樣?它是否產生了不良結果。如果是這樣? –

回答

0

我懷疑是子查詢(select max(id) from正在執行前值分配給@var1

我真的很驚訝,第一個例子可以工作;我從來沒有嘗試在LOAD DATA中運行子查詢。

當你說「這不起作用」,你的意思是LOAD DATA引發錯誤?或者你的意思是LOAD DATA成功完成,但意想不到的結果?

在後一種情況下,我推薦一個簡單的測試,在LOAD DATA之前單獨做一個SET @var1 = 1234;聲明,看看第一行會發生什麼。

如果發生錯誤,可能是該子查詢在該上下文中不受支持。 (我們需要查閱MySQL參考手冊,看看是否支持。)

這就是我的猜測。 1)意外的操作順序(@var1正在評估之前該行的值被分配給@var1),或者2)子查詢在該上下文中無效。


編輯

根據MySQL參考手冊5.7

http://dev.mysql.com/doc/refman/5.7/en/load-data.html

它看起來像一個子查詢的LOAD DATA語句的上下文支持。

+0

是的手冊顯示您可以訪問用戶變量。將@ var1結果用於分配給col1的空值,因此失敗。我需要設置從csv文件讀取的值。 – Aniks

+0

是的,我知道你可以給一個用戶變量'@ var1'分配一個字段,並在'SET'的右邊的表達式中引用用戶變量。我詢問的是當*子查詢得到評估時。我懷疑這個子查詢是否被評估過一次,*在外部LOAD DATA開始處理行之前*。我在回答中建議的測試旨在檢查該問題。在LOAD DATA語句之前,將該變量設置爲您希望工作的值,該值會導致子查詢'(select max(id)...'返回與第一行中的字段值不同的結果。 – spencer7593

0

我遇到同樣的問題。我的問題的一部分是,以你的表定義爲例,T1.col1被設置爲NOT NULL,但表達式「select max(id)from T2 where col2 = @ var1」導致沒有返回值,所以MySQL試圖爲col1分配一個空值。這並沒有解決所有問題,但這是一個開始。

這裏就是我的工作:

LOAD DATA LOCAL INFILE 'streets.csv' 
INTO TABLE streets 
CHARACTER SET latin1 
FIELDS TERMINATED BY ',' 
LINES TERMINATED BY '\n' 
IGNORE 1 LINES 
(pre_dir, name, suffix, post_dir, @community, @state) 
SET community_id  = (SELECT community_id FROM communities_v WHERE community_name = @community AND state_abbr = @state); 

編輯:我原本放了一堆其他的東西在這裏,我想到的是相關的問題,但事實證明,沒有。這確實是一個數據問題。我使用的子查詢有@community和@state的某些組合,它們對community_id沒有任何價值,所以我會仔細檢查你自己的子查詢,看它是否在所有情況下都返回一個值。