如何在不检查数据库的情况下在 php 中生成唯一的序列号或订单号?
4 回答
如果你想保证唯一性,那么你必须检查一些东西。您可以使用平面文件并仅存储最近使用的数字(然后可以递增),但不使用数据库会很愚蠢。您需要存储大量与号码相关的其他信息(联系方式、订单内容等),而数据库非常适合。
在 mysql 中使用自动增量列存在几个问题(尤其是它不能扩展到等效节点的事实)。
虽然您可以在任何地方(内存缓存、文件、数据库)维护序列生成器,但 PHP 并没有实现复杂的文件锁定语义——除了影响性能之外,您还可以快速进入解除锁定情况。它不能扩展到大容量。
如果你有可用的 PL/SQL,那么我建议在那里实现一个序列生成器——或者你可以考虑在 PHP 和 sqlite 中实现一个生成器。
我强烈建议您实现生成器来创建格式数量:
$use_number = ++$sequence_number 。str_pad($node_id, '0', $max_nodes, STR_PAD_LEFT);
其中 node_id 是唯一引用存储当前序列号的存储基板的数字。并且 $max_nodes 比 $node_id 中的最大位数略多(例如,3 最多允许 999 个节点)。
或者将其视为两个部分之间带有标点符号的字符串(和/或将这两个部分存储在不同的数据库列中)。
C。
如果您使用的是 MySQL 数据库,则可以使用auto_increment列生成序列号,而无需预先检查数据库。插入新行将导致为该列分配一个新的唯一 ID,而无需在 PHP 中读取/写入该列。
或者,如果您想要一个全局唯一 ID,甚至不需要数据库,那么您可以使用 PHP 的uniqid () 函数。请注意,这将返回一个字符串。如果您使用多台物理机器或在服务器之间移动,则应添加在每台机器上都不同的前缀(第一个参数)。在同一台机器上使用时,此函数不应返回相同的字符串值两次。