订单流水号=年月日+插入时记录的ID,如何实现? 如题,我要在订单表里生成订单记录,订单表有流水号,流水号要求不可重复,我想把这个流水号的生成规则设置为:当天的日期+订单ID,如当前时间是20120330,前一条订单id是5,那新要求新生成的订单流水号为:201203306,这个要怎么实现?最好能一个SQL语句来实现的,或者效率高些的。。谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SELECT CONCAT(DATE_FORMAT(CURDATE(),'%Y%m%d'),RIGHT(CONCAT('00',(SELECT MAX(id) FROM `attention`)+1),2)) 谢谢wwwwb,测试过这个语句是可以实现,不知还有没更高效的呢?可不可以实现流水号=当前日期+新插入的ID,我的意思是这个新插入的ID就不用通过子查询(SELECT MAX(id) FROM `attention`)来获取。因为插入时,ID是自增长的。。 在TRIGGER中:set new.id=CONCAT(DATE_FORMAT(CURDATE(),'%Y%m%d'),RIGHT(CONCAT('00',LAST_INSERT_ID() +1),2)) 建议还是在查询中实现,这样的效率反而是最高的。表中添加两个字段(id auto_increment , cdate date)然后直接在 select concat(DATE_FORMAT(cdate,'%Y%m%d'),right(1000+id,3)),.... 表中添加两个字段(id auto_increment , cdate date) 比如有这样的表: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发生重复?谢谢两位大侠! 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: 0mysql> 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> 其实这个是经常看到的问题,问题产生的原因就是传统的纸质时期的编号思维惯性。希望编号能体现某些表中已经存在的停止,比如希望显示订单的日期,希望在员工编号中显示部门等等。而在现代计算机条件中,只需要使用计算机自动生成的流水号就行了。你完全可以create table salesOrder ( soid, sdate, .... ) ,soid, 为主键,然后在其它表中直接引用这个soid 就行。 其实核心的问题,就是为什么需要在一个编号中显示日期? 好看?方便? 那方便了什么? 查找? 但你按日期在数据库是查找根本不是问题啊? 嗯,ACMAIN_CHM看的比较透彻啊很感谢!呵呵! 关mysql于海量数据查询 不知道有人在mysql5.0上 针对10亿条数据操作过没有 group by 和order by的执行顺序? 急求!mysql导入数据文件错误 求 MySql 5.10 的下载地址! 关于在linux下编译连接MYSQL数据库的程序,该包括哪个库? 关于MySQL和PostgreSQL的若干个问题,希望大家帮助! 高分求教……? 有没有想交我这个朋友的——得有共同语言(jsp+mysql) mysql 求金额占比 请教一个关于合并数据并排序的问题 mysql slow-log大文件切分问题
set new.id=CONCAT(DATE_FORMAT(CURDATE(),'%Y%m%d'),RIGHT(CONCAT('00',LAST_INSERT_ID() +1),2))
(id auto_increment , cdate date)然后直接在 select concat(DATE_FORMAT(cdate,'%Y%m%d'),right(1000+id,3)),....
(id auto_increment , cdate date)
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发生重复?谢谢两位大侠!
-> `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: 0mysql> 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>
create table salesOrder ( soid, sdate, .... ) ,soid, 为主键,然后在其它表中直接引用这个soid 就行。 其实核心的问题,就是为什么需要在一个编号中显示日期? 好看?方便? 那方便了什么? 查找? 但你按日期在数据库是查找根本不是问题啊?
嗯,ACMAIN_CHM看的比较透彻啊很感谢!呵呵!