如题,我要在订单表里生成订单记录,订单表有流水号,流水号要求不可重复,我想把这个流水号的生成规则设置为:当天的日期+订单ID,如当前时间是20120330,前一条订单id是5,那新要求新生成的订单流水号为:201203306,这个要怎么实现?最好能一个SQL语句来实现的,或者效率高些的。。谢谢!

解决方案 »

  1.   

    SELECT CONCAT(DATE_FORMAT(CURDATE(),'%Y%m%d'),RIGHT(CONCAT('00',(SELECT MAX(id) FROM `attention`)+1),2))
      

  2.   

    谢谢wwwwb,测试过这个语句是可以实现,不知还有没更高效的呢?可不可以实现流水号=当前日期+新插入的ID,我的意思是这个新插入的ID就不用通过子查询(SELECT MAX(id) FROM `attention`)来获取。因为插入时,ID是自增长的。。
      

  3.   

    在TRIGGER中:
    set new.id=CONCAT(DATE_FORMAT(CURDATE(),'%Y%m%d'),RIGHT(CONCAT('00',LAST_INSERT_ID() +1),2))
      

  4.   

    建议还是在查询中实现,这样的效率反而是最高的。表中添加两个字段
    (id auto_increment , cdate date)然后直接在 select concat(DATE_FORMAT(cdate,'%Y%m%d'),right(1000+id,3)),....
      

  5.   

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

  6.   

    比如有这样的表:
    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发生重复?谢谢两位大侠!
      

  7.   

    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>
      

  8.   

    其实这个是经常看到的问题,问题产生的原因就是传统的纸质时期的编号思维惯性。希望编号能体现某些表中已经存在的停止,比如希望显示订单的日期,希望在员工编号中显示部门等等。而在现代计算机条件中,只需要使用计算机自动生成的流水号就行了。你完全可以
    create table salesOrder ( soid, sdate, .... ) ,soid, 为主键,然后在其它表中直接引用这个soid 就行。 其实核心的问题,就是为什么需要在一个编号中显示日期? 好看?方便? 那方便了什么? 查找? 但你按日期在数据库是查找根本不是问题啊? 
      

  9.   


    嗯,ACMAIN_CHM看的比较透彻啊很感谢!呵呵!