2

我想编写一个查询,它只更新表的一行,然后返回更新的行。

我可以使用获得返回的行

select field from final table 
(update tablename set anotherfield = 'dd' where someanotherfield = 'bb')

种说法。但我不能只更新一行。

另外,我调用此查询的程序是一个多线程程序,我不想让任何进程死锁,所以我发现 SKIP LOCKED DATA 语句类似于 t-sql 查询中的 readpast。

所以我想做的是,我的程序使用一个像堆栈一样的 db2 表,每次只选择一行,更新它,这样任何其他线程都无法访问它,但不会让他们等待整个表,他们只是跳过更新的行和从表中选择下一条记录。在单个 db2 查询中是否可以执行此操作?

到目前为止我已经写了这个查询,它无法处理

select COLUMN3 FROM FINAL TABLE
   ( 
      update MYTABLE 
      set    COLUMN1 = 'R'
      where  COLUMN1 = ''
          order by COLUMN2 
          FETCH FIRST 1 ROW ONLY 
          SKIP LOCKED DATA 
   )

任何帮助将不胜感激,谢谢。

4

1 回答 1

1

假设 COLUMN2 是 unique_id ,您可以执行以下操作:

select COLUMN3 FROM FINAL TABLE
( 
    update MYTABLE 
    set    COLUMN1 = 'R'
    where  COLUMN1 = ''
        AND COLUMN2 = ( SELECT COLUMN2 
                        FROM MYTABLE 
                        ORDER by COLUMN2 
                        FETCH FIRST 1 ROW ONLY)
    SKIP LOCKED DATA 

)

您在更新中进行了订购,但这是行不通的。您必须将其限制为只有一个结果(可能使用您的主键)。

于 2013-09-27T22:41:17.430 回答