mysql自动生成单据编号

本文介绍了一种使用SQL语句自动生成唯一单据编号的方法,该方法结合日期和序列号,适用于订单系统中单据编号的自动生成,确保了每天生成的单据编号从001开始并递增。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一句SQL就可以直接生成唯一的单据编号,方便直接插入主表

select CONCAT ('test_', DATE_FORMAT(now(), '%Y%m%d'), 
RIGHT(CONCAT ('000' , ifnull(max(SUBSTR(orderNo, LENGTH(CONCAT('test_',DATE_FORMAT(now(), '%Y%m%d'))) + 1,
LENGTH(orderNo) - LENGTH(CONCAT ('test_' , DATE_FORMAT(now(), '%Y%m%d'))))) + 1, 1)), 3)) AS orderNo 
 from main_orderTable 
 where SUBSTR(orderNo, 5, 8)=substr(DATE_FORMAT(now(),'%Y%m%d') , 1, 8)

main_orderTable:订单主表
orderNo:单据编号字段

单据编号是由:自定义字段+年月日+编号(test_ + 20181017 + 001)组成,
每新增一条单据就自动生成一个唯一的单据编号,可以作为唯一标识,也可做关联索引

例如当天的单据编号已经是:test_20181017002,

那么再新增单据时就会自动生成test_20181017003的单据编号,
而且每天的单据都是由001开始累加的。

小tip

当然这里就有一个问题,我的编号位只有后三位,那就意味着如果当天的新增单据超过999条,那么单据编号就会出现问题。
我这里设3位是因为我清楚我的系统业务情况,一天内不会有那么多订单产生。设三位已经绰绰有余。

所有你设置的时候要根据你的系统实际情况来设置编号位,如果一天内产生的订单多,可以将编号位设的多一点。

OK!

### MySQL 中适用于进销存系统单据表结构设计 对于进销存系统中的单据表结构设计,考虑到业务逻辑复杂性和数据一致性要求较高的特点,在设计时需特别注意字段的选择以及索引的应用。下面是一个典型的单据表设计方案。 #### 表名:`orders` | 字段名称 | 数据类型 | 是否为空 | 备注 | |------------------|---------------|--------------|--------------------------------------------------------------| | `order_id` | INT | NOT NULL | 主键自增 | | `bill_no` | VARCHAR(50) | NOT NULL | 单据编号,唯一约束 | | `customer_id` | INT | | 客户ID | | `total_amount` | DECIMAL(18,2) | DEFAULT '0' | 订单总金额 | | `create_time` | DATETIME | NOT NULL | 创建时间,默认当前时间 | | `update_time` | TIMESTAMP | ON UPDATE CURRENT_TIMESTAMP | 更新时间,默认创建时间和更新时间为同一时刻 | | `status` | TINYINT(4) | DEFAULT '0' | 状态(如未付款、已发货等),默认状态为待确认 | 为了确保每张订单的单据号在同一天内不重复,并且每天自动重置[^5],可以采用如下策略: - 使用触发器结合存储过程来生成唯一的每日单据号码; - 或者通过应用程序层面控制,利用Redis等缓存技术实现高效并发下单场景下的唯一代号生产机制。 此外,还需考虑与其他模块的数据关联关系,比如客户信息(`customers`)、商品详情(`products`)等表格之间的外键连接,从而构建完整的交易链条。 ```sql CREATE TABLE orders ( order_id INT AUTO_INCREMENT PRIMARY KEY, bill_no VARCHAR(50) UNIQUE NOT NULL COMMENT '单据编号', customer_id INT COMMENT '客户ID', total_amount DECIMAL(18,2) DEFAULT 0 COMMENT '订单总金额', create_time DATETIME NOT NULL DEFAULT NOW() COMMENT '创建时间', update_time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', status TINYINT(4) DEFAULT 0 COMMENT '状态' ); ``` 此SQL语句定义了一个名为`orders`的基础版订单表,其中包含了上述提到的关键属性。实际应用中可能还需要根据具体需求调整字段设置并增加必要的辅助列。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值