如何更新一个记录并在单个db2查询中选择更新的行

时间:2013-09-27 21:58:27

标签: sql db2

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

我可以使用

获得返回的行
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 
   )

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

1 个答案:

答案 0 :(得分: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 

)

您在更新内部正在执行订单,但这不起作用。你必须只限制一个结果(可能使用你的主键)。