Как вставить 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).