HSQLDB - 可更新语句不适用于 "SELECT TOP" 或 "ORDER BY"
HSQLDB - updatable statements don't work with "SELECT TOP" or "ORDER BY"
我正在使用 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 n
、LIMIT
或 ORDER 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 和 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 n
、LIMIT
或 ORDER 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)