【问题标题】:How to insert NULL in mysql especially INT dataType如何在mysql中插入NULL,尤其是INT dataType
【发布时间】:2013-08-29 06:31:59
【问题描述】:

我有 80000 个需要插入数据库的重新编码,尤其是在表中:temp(ts, temp) temp 是 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"

希望有人可以帮助我。谢谢。

【问题讨论】:

    标签: java mysql jdbc


    【解决方案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();
    

    【讨论】:

    • 非常感谢。在你告诉我 PrepardStatement 之前,我不知道。这是我的问题的答案。来自 API: void setNull(int parameterIndex, int sqlType) throws SQLException :将指定参数设置为 SQL NULL。
    【解决方案2】:

    作为 Mark Rotteveel 答案的替代方案,您还可以使用 PreparedStatement.setObject(int, Object, int)

    您指定 SQL 类型(第三个参数),如果对象为空,它会自动插入空。它更快更容易。

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

    【讨论】:

      【解决方案3】:

      您应该考虑使用准备好的语句。如果这样做,您将找到有关如何处理空值 here 和其他地方的信息。

      如果您 100% 确定您的 val 值是干净的并且不会导致 SQL 注入(很少见,但可能),那么“构建字符串”方法需要在定义值时显式使用 null

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

      【讨论】:

      • 谢谢,你是对的。我走错路了。如果该值为空,则表示该记录为空,即使它有时间戳。所以我需要保留不为空的记录。
      【解决方案4】:

      我已经解决了这个问题。 代码更新如下:

      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) value(NULL)。

      【讨论】:

      • 这是一个完全合法的解决方案(虽然可以缩短一点),可惜没有任何解释就被否决了
      【解决方案5】:

      你应该明确地CAST NULL 作为一个 INT

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

      【讨论】:

        【解决方案6】:

        听起来您在应该发送 int 时发送“null”。也许尝试类似

        (val == null ? "" : val)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-22
          • 1970-01-01
          • 2019-05-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-09-16
          相关资源
          最近更新 更多