HSQLDB - 可更新语句不适用于 "SELECT TOP"或 "ORDER BY"

标签 hsqldb

我使用HSQLDB和preparedStatements很好,但是如果我在SQL语句中包含“SELECT TOP”或“ORDER BY”,当我调用updateBoolean(或UpdateInt等)时,我会遇到异常:

java.sql.SQLException: attempt to assign to non-updatable column

此示例代码运行良好:

preparedStatement = connection.prepareUpdatable(
    "SELECT " + MyTable.COL_ID + ", " +
        MyTable.COL_READ +
        " FROM " + MyTable.NAME +
        " WHERE " + MyTable.COL_LOCAL +
        " =? AND " + MyTable.COL_REMOTE +
        " =?",
    ResultSet.TYPE_FORWARD_ONLY,
    ResultSet.CONCUR_UPDATABLE);

preparedStatement.setString(1, localAddress);
preparedStatement.setString(2, remoteAddress);

ResultSet rs = connection.query(preparedStatement);

if (rs.next())
{
    rs.updateBoolean(MyTable.COL_READ, isRead);
    rs.updateRow();
}

如果我将“SELECT”更改为“SELECT TOP”,则会出现异常。或者如果我将其附加到 SQL 语句中:

" ORDER BY " + MyTable.COL_RECEIVED_TIMESTAMP + " DESC"

感谢您的帮助。

尼克B

最佳答案

可更新的 SELECT 语句不能包含 TOP nLIMITORDER BY。此限制是由 SQL 标准强加的。当您添加这些关键字之一时,您的 SELECT 将变得不可更新。

可以在带有上述关键字的WITH子句中使用子查询,并且SELECT是可更新的。

CREATE TABLE t (a int, b int, PRIMARY KEY(a));

WITH SUBQ(COL) AS (SELECT TOP 1 a FROM t) 
  SELECT * FROM t WHERE a IN (SELECT * FROM SUBQ)

关于HSQLDB - 可更新语句不适用于 "SELECT TOP"或 "ORDER BY",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35163880/

相关文章:

java - 错误 500 - NoClassDefFoundError : org/hsqldb/lib/LongValueHashMap

spring - 在测试类弄脏 Spring JUnit 应用程序上下文后如何重置它?

java - 我们可以将 .sql 文件导入 HSQL 数据库吗?

java - @GenerationType.IDENTITY 失败超过 10

java - 使用最新版本的 jdbc 连接器连接到 1.8 HyperSQL 数据库

java - 为什么 HSQLDB 中的数据库约束在 Hibernate 中使用事务时仅在提交期间检查?

java - hsqldb : Database lock acquisition when connecting to a file db

java - 与基于文件的 hsql 的连接给出 null

java - 为什么 Java HSQL 会抛出 AbstractMethodError 异常?

java - 如何检查模式是否由 <jdbc :embedded-database> tag 创建