gpt4 book ai didi

php - 生成连续的唯一代码,经常出现重复输入错误

转载 作者:行者123 更新时间:2023-11-29 06:29:43 25 4
gpt4 key购买 nike

我目前正在使用 PHP 和 Laravel。

我想要做的是生成一个唯一且连续的字符串作为代码。
在此示例中,代码用于采购订单。

我想要的是这样的:

PO/000001
PO/000002
PO/000003
PO/000004
PO/000005
PO/000006

数据库表架构:

create table `purchase_orders` (
`id` int unsigned not null auto_increment primary key,
`code` varchar(191) not null,
...
...
)

alter table `purchase_orders` add unique `purchase_orders_code_unique`(`code`)

这看起来很简单,我只需要获取auto_increment ID,因此codeid相对应,或多或少像这样:

id | code
1 | PO/000001
2 | PO/000002
3 | PO/000003
4 | PO/000004
5 | PO/000005
6 | PO/000006

我使用的代码:(使用Laravel的ORM语法)

$count = PurchaseOrders::max('id'); // Equivalent to select MAX (`id`) from purchase_orders
$code = 'PO/' . sprintf('%08d', $count + 1);

理论上它工作得很好,但实际上,经常会发生“冲突”,其中id不等于它生成的code,有时 >codeid 更大/更前面。例如,经常会发生这样的情况:

 id | code
... | ...
199 | PO/000199
200 | PO/000200
201 | PO/000202

下一笔交易的id将为202,生成的code应该是PO/000202 >。它将触发违反完整性约束错误,因为 PO/000202 已在 id: 201 上使用。

我大量使用数据库事务和提交,有时创建采购订单需要一些时间,而且还有多个用户正在创建采购订单。我不知道到底是怎么发生的,但冲突发生的频率很高,大约有 100 笔交易左右。

<小时/>

这是一个实时项目中发生的事件: id is 204, code is 205

如您所见,code 大于 id。下一个要插入的代码将是 ...000205,我的客户报告了一个错误:

SQLSTATE[23000]: Integrity constraint violation: 1062 Duplicate entry   
'PRCV/JKT/G/2019/00000205' for key 'dlvr_payments_code_unique'

您还可以看到 idcode 根本不相等

<小时/>

我之前也尝试过其他代码生成方法,而不是 MAX('id') 我使用 COUNT(*),但似乎比 MAX 更糟糕('id')

所以,问题是,我做错了什么?我怎样才能确保每次都有唯一的代码,这样以后就不会再发生这种情况?

我一直在考虑使用Redis或一些键值数据库来存储计数,有必要吗?

最佳答案

别这样做!

不要依赖PK来获得序号。它会让你在不同的尽头街道上。

我建议将您最后插入的采购订单 ID 存储在单独的表中,并不断进行相应更新。

除了维护表之外,将其存储在缓存(即 redis)中还可以提高应用程序的性能。

希望对您有所帮助!

关于php - 生成连续的唯一代码,经常出现重复输入错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57057093/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com