Java中使用MySQL库执行自增主键INSERT语句报错求助
解决Java中MySQL自增主键的插入异常问题
嗨,我来帮你搞定这个自增主键插入的问题!你遇到的异常大概率是JDBC对null值的处理和MySQL直接执行SQL时的逻辑略有差异,下面给你两种最靠谱的解决方法:
方法一:直接省略自增列(推荐)
既然cod_nfs是自增主键,MySQL会自动为它生成下一个递增ID,完全不需要在INSERT语句里指定这个列。修改你的SQL语句,去掉cod_nfs字段和对应的null值,既简洁又能避免问题:
// 去掉cod_nfs列,VALUES里也删除对应的null String SQL = "INSERT INTO infosetdata(savingDate_nfs,attributeValue_nfs,codInfoSet_nfs,codColumn_nfs,codRow_nfs) VALUES ('2019-01-08',?,?,?,?)"; for( String value : values ) { ps = conn.prepareStatement(SQL); ps.setString(1, value); // 对应attributeValue_nfs ps.setInt(2, dataId); // 对应codInfoSet_nfs ps.setInt(3, y); // 对应codColumn_nfs ps.setInt(4, x); // 对应codRow_nfs ps.executeUpdate(); y++; }
调整后,MySQL会自动处理cod_nfs的自增值,不会再抛出异常。
方法二:用DEFAULT代替null
如果你一定要在INSERT语句里保留cod_nfs列,可以把null替换成DEFAULT——MySQL自增列的默认行为就是生成下一个自增ID,这样JDBC就能正确识别并执行:
// 将null替换为DEFAULT String SQL = "INSERT INTO infosetdata(cod_nfs,savingDate_nfs,attributeValue_nfs,codInfoSet_nfs,codColumn_nfs,codRow_nfs) VALUES (DEFAULT,'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
如果后续需要用到刚插入的cod_nfs值,可以在创建PreparedStatement时指定返回生成的主键,然后通过getGeneratedKeys()获取:
ps = conn.prepareStatement(SQL, Statement.RETURN_GENERATED_KEYS); // ... 设置参数并执行executeUpdate() ResultSet rs = ps.getGeneratedKeys(); if(rs.next()) { long generatedId = rs.getLong(1); // 获取刚生成的cod_nfs值 }
内容的提问来源于stack exchange,提问作者FranCode
相关产品推荐
相关产品推荐

