
其中:
- OrderUID:使用 AUTO_INCREMENT 属性,作为订单的唯一标识,由数据库自动生成。
- OrderPrefix:存储订单号的前缀,例如 "ULEN21" 或 "UCMC21"。
这样,就不需要手动维护订单号的序列,而是直接依赖数据库的自增ID机制来保证唯一性。
生成完整订单号
在查询订单信息时,可以使用 CONCAT 函数将前缀和自增ID拼接起来,生成完整的订单号。
方法一:使用查询语句
SELECT
OrderUID,
CONCAT(OrderPrefix, LPAD(OrderUID, 6, '0')) AS OrderNumber,
CreatedBy,
CreatedOn
FROM tOrder;方法二:创建视图
为了方便使用,可以将上述查询语句保存为视图:
CREATE VIEW `vw_orders` AS
SELECT
OrderUID,
CONCAT(OrderPrefix, LPAD(OrderUID, 6, '0')) AS OrderNumber,
CreatedBy,
CreatedOn
FROM tOrder;之后,就可以直接查询 vw_orders 视图来获取包含完整订单号的订单信息。
PHP 代码示例
在 PHP 代码中,只需要插入 OrderPrefix 和其他相关信息即可:
$insArr =[
'OrderPrefix' => 'ULEN21', // 订单前缀
'CreatedBy' => 1,
];
$this->db->insert('tOrder',$insArr);
$insert_id = $this->db->insert_id(); // 获取自增ID优势分析
- 避免并发竞争: 使用数据库的自增ID机制,避免了多个请求同时修改订单号序列导致的竞争条件。
- 保证唯一性: 数据库的自增ID机制可以保证 OrderUID 的唯一性,从而保证订单号的唯一性。
- 简化代码: 无需手动维护订单号序列,简化了代码逻辑。
- 提高性能: 避免了复杂的事务和重试机制,提高了性能。
注意事项
- 确保 OrderUID 列的类型为 INT UNSIGNED 或更大的类型,以避免自增ID溢出。
- 在设计 OrderPrefix 时,需要考虑业务需求,确保前缀的唯一性。
- 如果需要根据订单号进行查询,可以考虑在 vw_orders 视图上创建索引。
总结
通过将订单号的前缀与自增ID分开存储,并利用数据库的自增ID机制,可以有效地解决高并发环境下订单号重复的问题。这种方案不仅简单可靠,而且可以提高性能,简化代码逻辑。在实际应用中,可以根据具体业务需求进行适当调整,例如使用外键关联订单前缀表,以实现更灵活的订单号管理。










