我想编写一个只更新表的一行然后返回更新行的查询。
我可以使用
获得返回的行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
)
任何帮助将不胜感激, 感谢。
答案 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
)
您在更新内部正在执行订单,但这不起作用。你必须只限制一个结果(可能使用你的主键)。