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

Seeky 2012-03-30 02:10:11
如题,我要在订单表里生成订单记录,订单表有流水号,流水号要求不可重复,我想把这个流水号的生成规则设置为:当天的日期+订单ID,如当前时间是20120330,前一条订单id是5,那新要求新生成的订单流水号为:201203306,这个要怎么实现?最好能一个SQL语句来实现的,或者效率高些的。。谢谢!
...全文
607 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))

56,687

社区成员

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

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