【问题标题】:Does PostgreSQL supports "SELECT... FOR UPDATE OF..." SQL?PostgreSQL 是否支持“SELECT... FOR UPDATE OF...” SQL?
【发布时间】:2011-07-28 00:42:19
【问题描述】:

我目前正在使用带有 JDBC 驱动程序的“PostgreSQL 9.0.4”数据库:“postgresql-9.0-801.jdbc4.jar”。

我有以下 JDBC SQL 使用“SELECT...FOR UPDATE OF...”子句检索列值(长)并通过在同一事务中递增来更新该值。
我需要返回长值,因此我需要使用SELECT Sql。

final PreparedStatement preparedStatement = _connection.prepareStatement(
              "select value from sequence where table_name='JOB' for update of value",
                  ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_UPDATABLE);

 long ret;
 try {
      final ResultSet resultSet = preparedStatement.executeQuery();
      resultSet.next();
      ret = resultSet.getLong(1);
      resultSet.updateLong(1, ret + 1);
      resultSet.updateRow();
 } catch (SQLException ex) {
      ex.printStackTrace(); 
 } 
finally {
     resultSet.close();
     preparedStatement.close();
 }
 return ret;

所有其他数据库,例如MySQL、Oracle、MS-SQL、Derby 与此类 SQL 配合良好 - 但 PostgreSQL 总是抛出以下异常。

     org.postgresql.util.PSQLException: ERROR: relation "value" in FOR UPDATE/SHARE clause not found in FROM clause
     Position: 68

我确实已经正确创建了带有“value”列的“sequence”表 - 所以这可能不是臭名昭著的区分大小写的问题。

这是否意味着 Postgres 不支持 "SELECT ...FOR UPDATE OF.." SQL 语法?
在这种情况下,实现相同效果的最佳方法是什么(即使用同一事务进行选择和更新)?

非常感谢,

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    是的。支持。但是语法是

    FOR UPDATE [ OF table_name [, ...] ] [ NOWAIT ]

    你可以在这里看到更多:

    http://www.postgresql.org/docs/8.2/static/sql-select.html#SQL-FOR-UPDATE-SHARE

    【讨论】:

    • 是的 - 它有效。实际上,我还必须将“table_name”列指定为 SELECT 语句的一部分。因此,这是更新后的声明。 “从其中 table_name='JOB' FOR UPDATE OF sequence 的序列中选择值,table_name”。非常感谢。
    猜你喜欢
    • 2018-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-27
    • 2014-11-29
    • 1970-01-01
    • 2012-08-03
    • 1970-01-01
    相关资源
    最近更新 更多