2013-08-26 10 views
11

Ho 80000 recodi che è necessario inserire nel database specialmente nella tabella: temp (ts, temp) temp è INT.Come inserire NULL in mysql in particolare INT dataType

Il problema è quasi 20000 i recodi sono nulli, quindi mi chiedo come inserire NULL in DB quando dataType è INT.

ho provato questo:

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); 

purtroppo inserire è il fallimento. Stampa il messaggio di eccezione:

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

Desiderare qualcuno mi può aiutare con esso. Grazie.

+2

Rimuovere le virgolette? –

+0

Modifica. grazie – Eric

risposta

13

è necessario utilizzare un PreparedStatement e utilizzare 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

Grazie mille. Prima di dirmi PrepardStatement, non lo sapevo. È la risposta alla mia domanda. Da API: void setNull (int parameterIndex, int sqlType) genera SQLException: imposta il parametro designato su SQL NULL. – Eric

0

Si dovrebbe esplicitamente CAST il NULL come un INT

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

0

Sembra che il tuo stanno inviando "null" quando si dovrebbe essere l'invio un int. Forse provare qualcosa di simile

(val == null "?": Val)

1

Si dovrebbe considerare l'utilizzo di istruzioni preparate. Se lo fai, troverai informazioni su come gestire i valori null here e altrove.

Se sei sicuro al 100% il valore del val è pulito e non causerà SQL Injection (raro, ma possibile), allora l'approccio "stringa costruito" ha bisogno di utilizzare in modo esplicito null quando si definisce il valore:

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

Grazie, hai ragione. Vado nel modo sbagliato Se il valore è nullo, significa che il record è nullo, anche se ha data/ora. Quindi ho bisogno di mantenere i record che non sono nulli. – Eric

0

Ho risolto questo problema. L'aggiornamento codici come segue:

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); 

In sostanza, se inserto nullo nel database, solo che inserire nella tabella di valori (val) (NULL).

+1

questa è una soluzione perfettamente legittima (anche se può essere abbreviata un po '), peccato che sia stata downvoted senza alcuna spiegazione – svarog

2

Come alternativa alla risposta di Marco Rotteveel, è anche possibile utilizzare PreparedStatement.setObject(int, Object, int).

Specificare il tipo SQL (terzo parametro) e se l'oggetto è nullo, inserisce automaticamente un valore nullo. È più veloce e più facile.

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