【问题标题】:Get generated keys from single insert statement with multiple values从具有多个值的单个插入语句中获取生成的键
【发布时间】:2016-10-19 19:46:26
【问题描述】:

我正在使用单个插入语句将多行插入到表中。该表有一个自增字段作为主键。

像这样:INSERT INTO MyTable VALUES (?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?)

StringJoiner sj = new StringJoiner(",");
for(int i=0;i<salesmen.size();i++)
    sj.add("(?,?,?,?)");

sql.append("INSERT INTO MyTable ");
sql.append("VALUES ");
sql.append(sj.toString());

try(PreparedStatement statement = connection.prepareStatement(sql.toString(),Statement.RETURN_GENERATED_KEYS)){
    int i = 1;
    for(Salesman salesman : salesmen){
        statement.setDate(i++, DateUtil.toSqlDate(date));
        statement.setString(i++, salesman.getName());
        statement.setInt(i++, salesman.getWeeklyTargetCustomerId());
        statement.setInt(i++, salesman.getCycle());
    }
    statement.executeUpdate();

    ResultSet generatedKeys = statement.getGeneratedKeys();
    while(generatedKeys.next()) {
        log.info("generated key: " + generatedKeys.getLong(1)); //only prints 1 id
    }
}
catch(SQLException e){
    log.info("(!!) SQL Exception in Execution: " + e.getMessage());
    log.info("\n\n" + sql.toString() + "\n");
}

当我调用getGeneratedKeys() 时,它返回一个ResultSet,只插入最后一行的ID,而不是所有行。如果我插入 50 行,如何获得包含 50 个生成键的结果集?

【问题讨论】:

  • 我遇到了同样的情况,你解决了吗?

标签: sql sql-server jdbc


【解决方案1】:

虽然这是一个老问题,但我希望它对某人有所帮助。

PreparedStatement pre = connection.prepareStatement("SQL", PreparedStatement.RETURN_GENERATED_KEYS);
for(Salesman salesman: salesmen) {
    pre.setString(i++, ...);
    pre.setString(i++, ...);
    ....
    pre.addBatch(); // Add this
}
pre.executeBatch(); // Add this
ResultSet rs = pre.getGeneratedKeys();
while(rs.next()) {
    int id = rs.getInt(1); // This should contain the id of the inserts in order.
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-08
    • 2018-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    相关资源
    最近更新 更多