2013-08-26 21 views
11

データベースに挿入する必要がある80000個のコードがあります。特にテーブル内に挿入する必要があります。temp(ts、temp) tempはINTです。mysqlにNULLを挿入する方法特にINTデータ型

問題はほぼ20000個のコードがヌルなので、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

あなたはずあなたは、あなたがintを送信する必要があるときに「ヌル」送信しているようですねINT

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

0

として明示的にCAST NULL。あなたはプリペアドステートメントを使用して検討すべきである

1

:(ヴァル?ヴァル== nullの "")おそらく

のようなものを試してみてください。もしあなたがそうしたなら、あなたはNULLを扱う方法の情報を見つけるでしょうhereと他のところで。

あなたval値がクリーンであると(まれ、しかし可能)SQLインジェクションが発生することはありません100%確信している場合は、「内蔵された文字列」アプローチが値を定義するときに明示的nullを使用する必要がある:

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

ありがとう、あなたは正しいです。私は間違った道を行く。値がNULLの場合は、タイムスタンプを持っていてもレコードがNULLであることを意味します。だから私はレコードがnullでないものを保持する必要があります。 – 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); 

基本的に、データベースへの挿入のヌルは、単にテーブルに挿入ない場合(ヴァル)値(NULL)。

+1

これは完全に正当な解決策です(少し短くすることができます)、あまりにも悪くない説明なしにdownvotedでした – svarog

2

マークRotteveelの答えの代わりに、あなたはまた、PreparedStatement.setObject(int, Object, int)を使用することができます。

SQL型(3番目のパラメータ)を指定し、オブジェクトがnullの場合はnullを自動的に挿入します。それはより速くて簡単です。

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