Как вставить NULL в mysql, особенно INT dataType
У меня есть 80000 рекодов, которые нужно вставлять в базу данных, особенно в таблице: temp (ts, temp)
temp - INT.
Проблема почти 20000 recodes равна null, поэтому мне интересно, как вставить NULL в DB, когда dataType - INT.
Я пробовал это:
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"
Пожелайте, чтобы кто-то помог мне с этим. Спасибо.
Ответы
Ответ 1
Вы должны использовать 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();
Ответ 2
Вам следует рассмотреть возможность использования подготовленных операторов. Если вы это сделаете, вы найдете информацию о том, как обращаться с нулями здесь и в другом месте.
Если вы на 100% уверены, что ваше значение val
является чистым и не вызовет SQL Injection (редко, но возможно), тогда подход "построенная строка" должен явно использовать null
при определении значения:
String sql = "INSERT INTO temp (val) VALUES (";
if (val == null) {
sql += "null";
} else {
sql += val;
}
sql += ")";
Ответ 3
В качестве альтернативы отвечу Марка Роттевеля вы также можете использовать PreparedStatement.setObject(int, Object, int).
Вы указываете тип SQL (третий параметр), и если объект имеет значение null, он автоматически вводит нуль. Это быстрее и проще.
String sql = "INSERT INTO temp(val) VALUES (?)";
PreparedStatement st = con.prepareStatement(sql);
st.setObject(1, value, Types.INTEGER);
count = st.executeUpdate();
Ответ 4
Вы должны явно указать CAST
значение NULL как INT
...VALUES(...CAST(NULL AS INT)
Ответ 5
Похоже, что вы отправляете "null", когда вы должны отправлять int. Возможно, попробуйте что-то вроде
(val == null? "": val)
Ответ 6
Я решил эту проблему.
Коды обновляются следующим образом:
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 в базу данных, просто вставьте в значение table (val) значение (NULL).