订单流水号=年月日+插入时记录的ID,如何实现?

Seeky 2012-03-30 02:10:11
如题,我要在订单表里生成订单记录,订单表有流水号,流水号要求不可重复,我想把这个流水号的生成规则设置为:当天的日期+订单ID,如当前时间是20120330,前一条订单id是5,那新要求新生成的订单流水号为:201203306,这个要怎么实现?最好能一个SQL语句来实现的,或者效率高些的。。谢谢!
...全文
655 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Seeky 2012-03-30
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

其实这个是经常看到的问题,问题产生的原因就是传统的纸质时期的编号思维惯性。希望编号能体现某些表中已经存在的停止,比如希望显示订单的日期,希望在员工编号中显示部门等等。

而在现代计算机条件中,只需要使用计算机自动生成的流水号就行了。你完全可以
create table salesOrder ( soid, sdate, .... ) ,soid, 为主键,然后在其它表中直接引用这个soid……
[/Quote]

嗯,ACMAIN_CHM看的比较透彻啊。。。很感谢!呵呵!
ACMAIN_CHM 2012-03-30
  • 打赏
  • 举报
回复
其实这个是经常看到的问题,问题产生的原因就是传统的纸质时期的编号思维惯性。希望编号能体现某些表中已经存在的停止,比如希望显示订单的日期,希望在员工编号中显示部门等等。

而在现代计算机条件中,只需要使用计算机自动生成的流水号就行了。你完全可以
create table salesOrder ( soid, sdate, .... ) ,soid, 为主键,然后在其它表中直接引用这个soid 就行。 其实核心的问题,就是为什么需要在一个编号中显示日期? 好看?方便? 那方便了什么? 查找? 但你按日期在数据库是查找根本不是问题啊?
Seeky 2012-03-30
  • 打赏
  • 举报
回复
非常之感谢!我明白了!我考虑再三,选择先插入再更新吧,因为在系统要求里,这个流水号很重要,所以务必要保存在表中,而通过查询的方式的话,,其他很多表都要执行这样的查询,反而担心效率问题。(业务上订单的查询都是以这个SN作为识别的,很多表都涉及到这个值)。
ACMAIN_CHM 2012-03-30
  • 打赏
  • 举报
回复
mysql> CREATE TABLE `order` (
-> `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
-> cdate date,
-> `oid` int(11) NOT NULL,
-> PRIMARY KEY (cdate,`id`)
-> );
Query OK, 0 rows affected (0.12 sec)

mysql> insert into `order`(cdate,oid) values
-> (curdate(),123),
-> (curdate(),124),
-> (curdate(),125),
-> (curdate()+interval 1 day,126),
-> (curdate()+interval 1 day,127),
-> (curdate()+interval 1 day,128);
Query OK, 6 rows affected (0.05 sec)
Records: 6 Duplicates: 0 Warnings: 0

mysql> select * from `order`;
+----+------------+-----+
| id | cdate | oid |
+----+------------+-----+
| 1 | 2012-03-30 | 123 |
| 2 | 2012-03-30 | 124 |
| 3 | 2012-03-30 | 125 |
| 1 | 2012-03-31 | 126 |
| 2 | 2012-03-31 | 127 |
| 3 | 2012-03-31 | 128 |
+----+------------+-----+
6 rows in set (0.00 sec)

mysql> select concat(DATE_FORMAT(cdate,'%Y%m%d'),right(1000+id,3)) as sn,oid from `order`;
+-------------+-----+
| sn | oid |
+-------------+-----+
| 20120330001 | 123 |
| 20120330002 | 124 |
| 20120330003 | 125 |
| 20120331001 | 126 |
| 20120331002 | 127 |
| 20120331003 | 128 |
+-------------+-----+
6 rows in set (0.00 sec)

mysql>
Seeky 2012-03-30
  • 打赏
  • 举报
回复
比如有这样的表:
CREATE TABLE `order` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`oid` int(11) NOT NULL,
`sn` varchar(32) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

那我要新增一个记录,实现要求的话,SQL是这样的吗?

INSERT INTO `order` VALUES('',oid值,(SELECT CONCAT(DATE_FORMAT(CURDATE(),'%Y%m%d'),id)));

或者说有没有更好的方式,来预防SN发生重复?谢谢两位大侠!
minitoy 2012-03-30
  • 打赏
  • 举报
回复
赞同,可以做联合主键。[Quote=引用 5 楼 的回复:]

表中添加两个字段
(id auto_increment , cdate date)
[/Quote]
rucypli 2012-03-30
  • 打赏
  • 举报
回复
表中添加两个字段
(id auto_increment , cdate date)
ACMAIN_CHM 2012-03-30
  • 打赏
  • 举报
回复
建议还是在查询中实现,这样的效率反而是最高的。

表中添加两个字段
(id auto_increment , cdate date)

然后直接在 select concat(DATE_FORMAT(cdate,'%Y%m%d'),right(1000+id,3)),....
wwwwb 2012-03-30
  • 打赏
  • 举报
回复
在TRIGGER中:
set new.id=CONCAT(DATE_FORMAT(CURDATE(),'%Y%m%d'),RIGHT(CONCAT('00',LAST_INSERT_ID() +1),2))
Seeky 2012-03-30
  • 打赏
  • 举报
回复
谢谢wwwwb,测试过这个语句是可以实现,不知还有没更高效的呢?可不可以实现流水号=当前日期+新插入的ID,我的意思是这个新插入的ID就不用通过子查询(SELECT MAX(id) FROM `attention`)来获取。因为插入时,ID是自增长的。。
wwwwb 2012-03-30
  • 打赏
  • 举报
回复
SELECT CONCAT(DATE_FORMAT(CURDATE(),'%Y%m%d'),RIGHT(CONCAT('00',(SELECT MAX(id) FROM `attention`)+1),2))
内容概要:本文档围绕“风储VSG-基于虚拟同步发电机的风储并网系统Simulink仿真”展开,系统介绍了采用虚拟同步发电机(VSG)控制策略的风电与储能联合并网系统的建模与仿真方法。通过Simulink平台构建完整的电力系统动态模型,重点实现VSG的关键控制逻辑,以提升新能源并网的稳定性、惯性响应与频率支撑能力。文档不仅涵盖核心仿真模型,还整合了大量相关前沿研究内容,如混合储能调频、微电网优化、电动汽车可调能力评估、智能算法在电力系统中的应用等,并提供丰富的Matlab/Simulink代码实例,具有较强的科研复现价值和技术参考意义。; 适合人群:具备电力系统基础理论知识和Matlab/Simulink仿真能力的研究生、科研人员及从事新能源发电、储能控制、智能电网等领域工作的工程技术人员;特别适用于正在开展风储协同控制、虚拟同步机、构网型变流器等相关课题研究的高校师生。; 使用场景及目标:① 深入理解虚拟同步发电机(VSG)在风储并网系统中的控制原理与技术优势;② 借助提供的仿真模型与代码完成科研论文复现、算法验证与系统性能测试;③ 探索新能源高渗透背景下提升电网稳定性的关键技术路径,包括惯量模拟、一次频率响应、储能协同控制等。; 阅读建议:建议读者按照文档结构循序渐进地学习,优先下载并运行配套的Simulink模型与Matlab代码,结合VSG控制策略的设计细节进行调试与分析,同可关注公众号“荔枝科研社”获取完整资源包及持续的技术支持,以提升科研效率与创新能力。

57,064

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧