【问题标题】:JDBC Insert with autoincrement带自动增量的 JDBC 插入
【发布时间】:2019-01-09 15:52:47
【问题描述】:

我正在使用 java 中的 MySQL 库执行查询。 在我的 db 结构中有一个名为 cod_nfs 的列(主键,不是 null 和 auto_increment)。 通常在每个插入查询中我将值设置为 null 并在查询执行后递增最后一个 id 但在 java 中这样做会给我异常。

代码如下:

String SQL = "INSERT INTO infosetdata(cod_nfs,savingDate_nfs,attributeValue_nfs,codInfoSet_nfs,codColumn_nfs,codRow_nfs) VALUES (null,'2019-01-08',?,?,?,?)";


for( String value : values ) {
                ps = conn.prepareStatement(SQL);
                ps.setString(1, value);
                ps.setInt(2, dataId);
                ps.setInt(3, y);
                ps.setInt(4, x);
                ps.executeUpdate();
                y++;
            }

如何使用自动递增 id 执行查询?

【问题讨论】:

  • 您能否尝试从插入语句中删除 autu 递增列。 Try::> String SQL = "INSERT INTO infosetdata(savingDate_nfs,attributeValue_nfs,codInfoSet_nfs,codColumn_nfs,codRow_nfs) VALUES ('2019-01-08',?,?,?,?)";
  • 我做到了,我得到了这个异常:线程“main”java.sql.SQLException中的异常:字段'cod_nfs'没有默认值
  • 正确的方法是在插入列表中指定cod_nfs。如果您遇到该异常,则它不是自动增量列。请将表格的 DDL 添加到您的问题中。
  • 是的,你是对的。我的管理员构建了数据库结构,我确信 cod_nfs 是一个 auto_increment 列。谢谢
  • 你可以尝试运行命令:ALTER TABLE infosetdata MODIFY cod_nfs INT(11) NOT NULL AUTO_INCREMENT;

标签: java mysql sql jdbc


【解决方案1】:

您不应为 cod_nfs 设置值,因为它已设置为自动增量。试试下面:

String SQL = "INSERT INTO infosetdata(savingDate_nfs,attributeValue_nfs,codInfoSet_nfs,codColumn_nfs,codRow_nfs) VALUES ('2019-01-08',?,?,?,?)

如果出现错误,请确保您的 cod_nfs 列设置为自动增量。尝试运行:

ALTER TABLE infosetdata MODIFY cod_nfs INT(11) NOT NULL AUTO_INCREMENT

感谢 @Mark Rotteveel 在 cmets 中帮助解决该问题。

【讨论】:

    【解决方案2】:

    不要在插入中包含主键列。

    另外,不要每次都准备语句。只做一次。

    String SQL = "INSERT INTO infosetdata (savingDate_nfs,attributeValue_nfs,codInfoSet_nfs,codColumn_nfs,codRow_nfs) " 
               + "VALUES ('2019-01-08',?,?,?,?)";
    ps = conn.prepareStatement(SQL);
    for( String value : values ) {
       ps.setString(1, value);
       ps.setInt(2, dataId);
       ps.setInt(3, y);
       ps.setInt(4, x);
       ps.executeUpdate();
       ResultSet rs = ps.getGeneratedKeys();
       if (rs.next()) {
         int pk = rs.getInt(1);
         System.out.println("Generated PK = " + pk);
       }
       y++;
    }
    

    如您所见,您可以使用PreparedStatement.getGeneratedKeys() 恢复生成的 PK 值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-12
      • 1970-01-01
      • 2020-10-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      相关资源
      最近更新 更多