首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >JDBC getGeneratedKeys()

JDBC getGeneratedKeys()
EN

Stack Overflow用户
提问于 2012-11-03 01:10:11
回答 1查看 4.5K关注 0票数 1

我从http://docs.oracle.com/javase/1.4.2/docs/guide/jdbc/getstart/preparedstatement.html获得了以下代码示例

我有三个问题:

  1. “keyColumn”指的是考虑只有三列--最后一列,第一列是家。
  2. 为什么循环用于迭代生成的键?是否为该insert语句返回多行?
  3. 哪些数据库支持每个表生成的多个键?
代码语言:javascript
复制
String sql = "INSERT INTO AUTHORS (LAST, FIRST, HOME) VALUES " +
                                     "(?, ?, ?, keyColumn)";

PreparedStatement addAuthor = con.prepareStatement(sql,
                             Statement.RETURN_GENERATED_KEYS);
addAuthor.setString(1, "Wordsworth");
addAuthor.setString(2, "William");
addAuthor.setString(3, "England");

int rows = addAuthor.executeUpdate();

ResultSet rs = stmt.getGeneratedKeys();
if (rs.next()) {
    ResultSetMetaData rsmd = rs.getMetaData();
    int colCount = rsmd.getColumnCount();
    do {
        for (int i = 1; i <= colCount; i++) {
            String key = rs.getString(i);
            System.out.println("key " + i + "is " + key);
        }
    }
    while (rs.next();)
} 
else {
    System.out.println("There are no generated keys.");
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-03 10:00:49

问题1.我认为链接上的查询中的keyColumn只是示例中的一个错误。该段中的第二个和第三个例子也包含严重的语法错误。我不想再多说了。这个文档已经从最近的Java版本中完全删除了。

问题2.考虑像INSERT INTO ... SELECT ... FROM ...INSERT INTO ... VALUES (...), (...)这样的语句,它们可以生成多个插入的行。此外,一些数据库支持从其他DML (例如UPDATEDELETE)返回值,这也会影响多行,这就是为什么需要考虑循环。在这个特定的例子中,这是不必要的,因为您可以确保只插入一行。

问题3.这个问题有点复杂:

有些数据库(或驱动程序)无法轻松决定实际生成的列是什么。例如,因为数据库没有IDENTITY列,而是使用触发器生成键。识别生成的键将涉及解析表上的所有触发器,以检查它是否将生成的值分配给(主键或其他)列,这并不容易完成,而且容易出错。有时会有多个生成的列(即计算字段等)。作为开发人员,您应该知道您可以或希望返回哪些字段。

由于很难(或效率低下)决定返回哪些字段,一些驱动程序(默认情况下)返回插入(或删除/更新)行的所有列。例如,PostgreSQL和火鸟驱动程序就是这样做的。另一方面,一些驱动程序只是返回最后生成的键,即使表不包含标识列(我相信MySQL会返回,但不能100%确定)。我似乎还记得,Oracle驱动程序只是返回ROWID,让用户使用该ROWID从数据库中检索实际值。

如果您具体知道要返回哪些列,则可以使用接受列序数指数列名数组的替代方法指定该列。虽然并不是所有的司机都支持这一点。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13205031

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档