尝试使用 H2 数据库更新 JDBC ResultSet 时出现异常

Posted

技术标签:

【中文标题】尝试使用 H2 数据库更新 JDBC ResultSet 时出现异常【英文标题】:Exception while trying to update an JDBC ResultSet using a H2 database 【发布时间】:2014-12-15 08:38:14 【问题描述】:

我尝试使用 ResultSet 将一行插入 H2 数据库 (1.4.182)。通过调用 insertRow,程序会抛出异常。而且我不知道问题是什么。

例外是:

The result set is not updatable. The query must select all columns from a unique key.
Only one table may be selected. [90127-182]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.get(DbException.java:155)
    at org.h2.message.DbException.get(DbException.java:144)
    at org.h2.jdbc.JdbcResultSet.getUpdatableRow(JdbcResultSet.java:3081)
    at org.h2.jdbc.JdbcResultSet.insertRow(JdbcResultSet.java:2966)
    at JdbcResultSetUpdate.main(JdbcResultSetUpdate.java:26)

程序为创建ResultSet而执行的SQL语句是:

"select NAME from TEST.TST_DOZENT"

TST_DOZENT 由语句创建:

"CREATE TABLE TEST.TST_DOZENT (NAME VARCHAR(50))", "Create TST_DOZENT-Tab"

所以查询语句不使用系统表,表没有主键。

java语句对象的创建者:

con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);

我无法弄清楚问题是什么或我做错了什么。

我将不胜感激。

感谢您的阅读。

【问题讨论】:

错误信息非常不言自明“查询必须从唯一键中选择所有列。”;您的表没有主键(或其他唯一键),因此选择结果集不可更新。 @MarkRotteveel 错误消息远非不言自明。相反,要从中推导出The table needs to have a primary key or unique index, and the query needs to contain that column 是相当困难的。 @KorayTugay 这只是对该错误消息所说的内容的更冗长的改写。 “查询必须从唯一键中选择所有列。” 说明两件事:1)从唯一键中选择 所有列 2)从 唯一的密钥。如果您必须从唯一键中进行选择,那么逻辑上该表必须具有唯一键,否则您无法满足该要求。 @MarkRotteveel 好吧,如果你这么说的话.. 【参考方案1】:

表需要有一个主键或唯一索引,并且查询需要包含该列。示例:

CREATE TABLE TEST.TST_DOZENT (ID PRIMARY KEY, NAME VARCHAR(50));
SELECT ID, NAME FROM TEST.TST_DOZENT;

【讨论】:

如果我的 PK 分布在多个列(复合主键)怎么办?在这种情况下,我们是否需要选择构成 PK 的所有列?

以上是关于尝试使用 H2 数据库更新 JDBC ResultSet 时出现异常的主要内容,如果未能解决你的问题,请参考以下文章

如何断开 Glassfish 上的所有 JDBC 连接并解锁 H2 数据库?

Hibernate/H2 外键抛出 org.h2.jdbc.JdbcSQLException

删除约束后 h2 删除列失败

使用 Spring 和 jdbc DataSourceTransactionManager 填充 H2 数据库

org.h2.jdbc.JdbcSQLException:未知数据类型:“DATEADD”; SQL 语句

org.h2.jdbc.JdbcSQLException:数据库可能已在使用中:“被另一个进程锁定”