2013-08-26 37 views
11

我有80000個需要插入數據庫的recodes,特別是在表中:temp(ts,temp) temp是INT。如何在mysql中插入NULL特別是INT dataType

問題幾乎是20000 recodes是空的,所以我想知道如何在dataType爲INT時將NULL插入到DB中。

我嘗試這樣做:

String val = null; 

//insert(ts, val) into temp 
String sql = "INSERT INTO temp" + "(val)" + " VALUES" + "('" + val + "')"; 
Statement st = (Statement) conn.createStatement(); 
count = st.executeUpdate(sql); 

不幸插入是失敗的。打印出例外信息:

Incorrect integer value: 'null' for column 'val' at row 1" 

希望有人可以幫助我。謝謝。

+2

刪除引用? –

+0

編輯它。謝謝 – Eric

回答

13

您應該使用PreparedStatement,並使用setNull(int, int)

String sql = "INSERT INTO temp(val) VALUES (?)"; 
PreparedStatement st = con.prepareStatement(sql); 
if (/* int value is not null */) { 
    st.setInt(1, value); 
} else { 
    set.setNull(1, Types.INTEGER); 
} 
count = st.executeUpdate(); 
+1

非常感謝。在你告訴我PrepardStatement之前,我不知道它。這是我的問題的答案。從API:void setNull(int parameterIndex,int sqlType)throws SQLException:將指定參數設置爲SQL NULL。 – Eric

0

你應該明確地CAST的NULL作爲INT

...VALUES(...CAST(NULL AS INT)

0

這聽起來像你的時候,你應該發送一個int在發送「空」。也許你可以試試

(VAL == NULL 「」:VAL)

1

您應該考慮使用準備好的語句。如果你這樣做,你會發現如何處理空值here和其他地方的信息。

如果你是100%肯定你的價值val是乾淨的,不會造成SQL注入(罕見,但有可能),那麼「內置字符串」方法需要定義的值時,明確地使用null

String sql = "INSERT INTO temp (val) VALUES ("; 
if (val == null) { 
    sql += "null"; 
} else { 
    sql += val; 
} 
sql += ")"; 
+0

謝謝你,你是對的。我走錯了路。如果該值爲空,則表示該記錄爲空,即使它具有時間戳。所以我需要保留那些不爲空的記錄。 – Eric

0

我已經解決了這個問題。 的代碼更新如下:

String sql= null; 
if(val.isEmpty()){ 
System.out.println(val); 
System.out.println("Insert ts: " + ts + " val: null"); 
sql= "INSERT INTO " + table + "(ts,val,pointId)" + " VALUES" + "(" + "'" + ts + "'" + ", " + "NULL" + " , " + "'" + pointId + "'" + ")"; 
} 
else{ 
System.out.println("Insert ts: " + ts + " val: " + val); 
sql= "INSERT INTO " + table + "(ts,val,pointId)" + " VALUES" + "(" + "'" + ts + "'" + ", " + "'" + val + "'" + ", " + "'" + pointId + "'" + ")"; 
} 

Statement st = (Statement) conn.createStatement(); //create the instances of statement 
count = st.executeUpdate(sql); 

基本上,如果插入空到數據庫,只是插入到表(VAL)值(NULL)。

+1

這是一個完全合法的解決方案(壽命可以縮短一點),太糟糕了,它沒有任何解釋downvoted – svarog

2

作爲替代馬克Rotteveel的回答,您還可以使用PreparedStatement.setObject(int, Object, int)

指定SQL類型(第三參數),如果對象爲null,則自動插入null。它更快,更容易。

String sql = "INSERT INTO temp(val) VALUES (?)"; 
PreparedStatement st = con.prepareStatement(sql); 
st.setObject(1, value, Types.INTEGER); 
count = st.executeUpdate();