sql jdbc getgeneratedkeys 返回列“id”未找到,列类型未知

Posted

技术标签:

【中文标题】sql jdbc getgeneratedkeys 返回列“id”未找到,列类型未知【英文标题】:sql jdbc getgeneratedkeys returns column "id" not found, column type unknown 【发布时间】:2011-02-20 17:42:35 【问题描述】:

我想使用插入查询检索表中最近更新的值。

这些是我的 sql 表中的数据类型。

数据类型:

int(11)      // primary key auto increment, not being assigned by sqlQuery
varchar(30)
timestamp    // has a default value. but i am explicit assigning it using CURRENT_TIMESTAMP
varchar(300)
varchar(300)
varchar(300)
int(11)
varchar(300)

java代码

   statement.executeUpdate(sqlQuery, Statement.RETURN_GENERATED_KEYS);
   ResultSet rs = statement.getGeneratedKeys();
   System.out.println("here: " + rs.getMetaData().getColumnCount());
   System.out.println("here1: " + rs.getMetaData().getColumnName(1));
   // none of the following 3 works
   System.out.println("id: " + rs.getInt(1));
   System.out.println("id: " + rs.getInt("GENERATED_KEY"));
   System.out.println("id: " + rs.getInt("id"));
   for a bit of background see [this][1]
  `rs.getMetaData().getColumnTypeName(1)` tells me column type `UNKNOWN`

堆栈跟踪

    SEVERE: null
    java.sql.SQLException
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1055)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:956)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:926)
    at com.mysql.jdbc.ResultSetImpl.checkRowPos(ResultSetImpl.java:815)
    at com.mysql.jdbc.ResultSetImpl.getStringInternal(ResultSetImpl.java:5528)
    at com.mysql.jdbc.ResultSetImpl.getString(ResultSetImpl.java:5448)
  [1]: http://***.com/questions/2853066/sql-java-get-value-assigned-to-auto-increment-primary-key

【问题讨论】:

问题不清楚吗? 您使用的是什么版本的 MySQL 和 MySQL 连接器? 【参考方案1】:

您需要拨打rs.next():

int autoIncKeyFromApi = -1;
rs = stmt.getGeneratedKeys();
if (rs.next()) 
    autoIncKeyFromApi = rs.getInt(1);
 else 
    // do what you have to do

System.out.println(autoIncKeyFromApi);

【讨论】:

我尝试了几种组合。不是这个! 没错,但我会把它放在if 块中。另请参阅this answer。 @PascalThivent 你能解释一下为什么我们需要 rs.next() 吗?【参考方案2】:

可能是因为 sqlQuery 没有创建任何新记录! 在这种情况下,它将返回一个空的 ResultSet 看getGeneratedKeys()的规范

【讨论】:

以上是关于sql jdbc getgeneratedkeys 返回列“id”未找到,列类型未知的主要内容,如果未能解决你的问题,请参考以下文章

jdbc-mysql基础 ResultSet getGeneratedKeys 插入一条字段并返回其主键

如何让 Statement.getGeneratedKeys 工作

Oracle 11g JDBC 预取键

(转)MYSQL获取自增主键4种方法

如何从 Oracle 中的 JDBC 批量插入中获取生成的密钥?

jdbc 有效地获取生成的密钥以及其他数据