假设我有一个包含这些字段的表顺序:
最初订单是使用payment_date和invoice_number创建的,其中包含NULL值,因此我可以拥有以下行:
ID | payment_date | invoice_number
1 | NULL | NULL
2 | 03/10/11 | 1
3 | 03/14/11 | 2
4 | NULL | NULL
5 | NULL | NULL
我想要做的是当我更新一行以填充payment_date时,我需要使用第一个可用的invoice_number更新invoice_number。例如,如果我更新第五行,则invoice_number将为“3”。
第一种方法是为invoice_number选择MAX()值,然后将1加到该值,但这会产生并发问题,对吗?
您认为最佳解决方案是什么?
提前致谢!
答案 0 :(得分:6)
如果您想避免并发问题,可以在transaction或trigger中执行此操作。
如果你这样做:
update table
set
column = 'something'
column = (select max(id) + 1 from table)
where id = 123
您也不会遇到并发问题。当您执行此更新时,表将被锁定,因此在查询运行时,没有其他人可以更新它。
答案 1 :(得分:3)
你可以做“选择MAX()” - 解决方案,如果你使用SELECT FOR UPDATE - dbms将处理并发问题。 SELECT FOR UPDATE