2013-08-26 19 views
11

Mam 80000 recodes, które trzeba wstawić do bazy danych, szczególnie w tabeli: temp (ts, temp) temp jest INT.Jak wstawić NULL w mysql szczególnie INT dataType

Problem polega na tym, że prawie 20000 zapisów ma wartość null, więc zastanawiam się, jak wstawić NULL do DB, gdy typ danych to INT.

Próbowałem to:

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

niestety wstawić jest awaria. Wydrukuj komunikat wyjątku:

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

Życzę, aby ktoś mi w tym pomógł. Dziękuję Ci.

+2

Usunąć cytaty? –

+0

Edytuj. dzięki – Eric

Odpowiedz

13

Należy użyć PreparedStatement i używać 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

Wielkie dzięki. Zanim powiedziałeś mi o PrepardStatement, nie wiedziałem o tym. To jest odpowiedź na moje pytanie. Z API: void setNull (int parameterIndex, int sqlType) wyrzuca SQLException: ustawia wyznaczony parametr na SQL NULL. – Eric

0

należy jawnie CAST NULL jako INT

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

0

Brzmi jak twój wysyłania „null”, w którym powinny być wysyłane int. Być może spróbować czegoś podobnego

(val == null "": Val)

1

Należy rozważyć użycie przygotowanych sprawozdań. Jeśli to zrobisz, znajdziesz informacje o tym, jak radzić sobie z zerami here i gdzie indziej.

Jeżeli jesteś w 100% pewien swoją wartość val jest czysty i nie spowoduje SQL Injection (rzadkie, ale możliwe), to podejście „zbudowany ciąg” musi jawnie użyć null przy określaniu wartości:

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

Dziękuję, masz rację. Idę źle. Jeśli wartość jest pusta, oznacza to, że rekord jest pusty, nawet jeśli ma znacznik czasu. Muszę więc zachować zapisy, które nie są zerowe. – Eric

0

Rozwiązałem ten problem. Aktualizacja kody w następujący sposób:

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

Zasadniczo, jeśli wkładka NULL do bazy danych, po prostu należy wkładać w tabeli wartość (val) (NULL).

+1

jest to całkowicie uzasadnione rozwiązanie (może być nieco skrócone), szkoda, że ​​nie zostało ono zatwierdzone bez żadnego wyjaśnienia. – svarog

2

Jako alternatywę dla odpowiedzi Mark Rotteveel, można również użyć PreparedStatement.setObject(int, Object, int).

Użytkownik określa typ SQL (3rd Parameter), a jeśli obiekt ma wartość NULL, automatycznie wstawia wartość null. Jest to szybsze i łatwiejsze.

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