我有80000个需要插入数据库的重新编码,特别是在表中:temp(ts,temp) temp是INT。
问题是将近20000个重新编码为空,所以我想知道当dataType为INT时如何在DB中插入NULL。
我试过了:
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"
希望有人可以帮助我。谢谢。
答案 0 :(得分:20)
您应该使用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 :(得分:4)
作为Mark 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();
答案 2 :(得分:2)
我已经解决了这个问题。 代码更新如下:
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插入数据库,只需插入表(val)值(NULL)。
答案 3 :(得分:1)
您应该考虑使用准备好的陈述。如果您这样做,您将找到有关如何处理空值here和其他地方的信息。
如果你100%确定你的val
值是干净的并且不会导致SQL注入(很少见,但可能),那么“构建字符串”方法需要明确使用null
时定义值:
String sql = "INSERT INTO temp (val) VALUES (";
if (val == null) {
sql += "null";
} else {
sql += val;
}
sql += ")";
答案 4 :(得分:0)
您应该将NULL显式CAST
作为INT
...VALUES(...CAST(NULL AS INT)
答案 5 :(得分:0)
听起来你应该发送一个int时发送“null”。也许尝试像
这样的东西(val == null?“”:val)