使用 MySQL 生成顺序 ID

Generating sequential ID using MySQL

我需要为收到的每个订单生成条形码参考。第一个条码是 200000,以后每下一个订单加 1。我必须绝对确定我不会将相同的条形码分配给多个订单。该项目收到大量订单,而且通常接二连三。

为了克服这个问题,我创建了一个名为 barcodes 的 MySQL 数据库 table,它带有一个自动递增的主键。第一行的ID是200000。

每次我需要生成条形码时,我都会插入 barcodes table,然后使用 PHP 的 mysqli_insert_id() 来插入 ID。然后我更新 orders table 以便条形码设置为此值。

这很好用,可以防止我将相同的条形码分配给多个订单。

有没有更好的方法?理想情况下,我会有一个 table 存储下一个可用 ID,然后 运行 两个查询:

select next_barcode from barcodes where id=1

然后

update barcodes set next_barcode=next_barcode+1 where id=1

我在这里担心的是,我的代码可以调用执行 SELECT 的函数,同时(即在更新之前)具有 运行 并且两个订单被赋予相同的条形码。

也许有一些可靠的table锁定方法?或者也许我目前的方法是最好的方法?

你做的很好。您将保证不会两次获得相同的 ID。 如果您为此发明了自己的系统,您将需要锁定许多表,破坏并发性或通过事务完成所有事情。绝对有可能完成你正在做的交易,但最好的方法可能主要是复制 AUTO_INCREMENT 已经做的事情..它更难。

需要记住的一件事是,在某些情况下 MySQL 可能会跳过 AUTO_INCREMENT 中的一个 ID,但你保证永远不会两次获得相同的号码。

就您目前使用的 auto_increment 而言,它是适合您的用例的最佳方式。 通过设计 保证了唯一性,并且数据库会在后台为您完成繁重的工作。

唯一可能的缺点是您可能会在 id 中遇到间隙 - 例如,当 insert 由于某种原因失败时,序列 id 可能会丢失,并且下面的插入将再次增加 id,导致序列中出现间隙。

如果这对您来说是个问题,那么一种选择是在插入时使用 insert ... select 语法在单个查询中获取最新 ID 和新 ID,例如:

insert into barcodes (id, ...)
select coalesce(max(id), 0) + 1, ...
from barcodes

这可以防止两行变得相同 id。但同样,我不建议这样做;使用 auto_increment 更高效、更简单。