UPDATE上的MySQL自动增量字段(最初为NULL)

jäv*_*ävi 5 mysql

假设我有一个包含这些字段的表顺序:

  • ID(PK和常规auto_increment)
  • 付款日期
  • 发票编号

最初使用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
Run Code Online (Sandbox Code Playgroud)

我想要做的是当我更新一行以填充payment_date时,我需要使用第一个可用的invoice_number更新invoice_number.例如,如果我更新第五行,则invoice_number将为"3".

第一种方法是为invoice_number选择MAX()值,然后将1加到该值,但这会产生并发问题,对吧?

您认为什么是最佳解决方案?

提前致谢!

krt*_*tek 6

如果要避免并发问题,可以在事务触发器中执行此操作.

如果你做这样的事情:

update table
set 
    column = 'something'
    column = (select max(id) + 1 from table)
where id = 123
Run Code Online (Sandbox Code Playgroud)

您也不会遇到并发问题.当您执行此更新时,表将被锁定,因此在查询运行时,没有其他人可以更新它.

  • 我试过这个解决方案,但它给了我这个错误:你不能在 FROM 子句中指定目标表“订单”进行更新 (2认同)

Gam*_*nus 3

如果您使用 SELECT FOR UPDATE,您可以执行“Select MAX()”解决方案 - dbms 将处理并发问题。 选择更新