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

Posted

技术标签:

【中文标题】HSQLDB - 可更新语句不适用于“SELECT TOP”或“ORDER BY”【英文标题】:HSQLDB - updatable statements don't work with "SELECT TOP" or "ORDER BY" 【发布时间】:2016-02-02 21:13:09 【问题描述】:

我使用 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

【问题讨论】:

【参考方案1】:

可更新的 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”的主要内容,如果未能解决你的问题,请参考以下文章

SQL - 如果存在不适用于 Select 语句?

唯一约束 (indexExists) 的 Liquibase 前提条件不适用于 HSQLDB 数据库?

Group by 语句不适用于 Select Case

MySQL 查询适用于 SELECT 但不适用于 UPDATE 语句

SELECT 语句中的列别名不适用于 SQuirrel SQL + Firebird

序列生成的主键似乎不适用于 select 语句