需要用MySQL函数生成一下有序且不重复的交易号,如下标准:     
2009051100001234
.......................
2009051100001235
2009051100001236
2009051100001237  

解决方案 »

  1.   

    1、日期可以用CURDATE()得到,格式化一下就OK;
    2、后面的8位生成:你的字段是自增还是一般的VARCHAR字段,在网络上还是单机?
      

  2.   

    如果是自增:用LAST_INSERT_ID()取得刚刚插入的值,注意 ,要先插入再取得
    如果不是:SELECT MAX(ID) FROM  FOR UPDATE
    将两部份CONCAT就OK
      

  3.   

    mysql> CREATE TABLE tb(BH CHAR(16),content VARCHAR(20),`date` DATETIME,val INT);
    Query OK, 0 rows affected (0.05 sec)mysql>
    mysql>
    mysql> DELIMITER $$
    mysql> DROP TRIGGER IF EXISTS tri_NewBH $$
    Query OK, 0 rows affected, 1 warning (0.00 sec)mysql>
    mysql> CREATE TRIGGER tri_NewBH BEFORE INSERT ON tb
        -> FOR EACH ROW
        -> BEGIN
        ->     DECLARE dt CHAR(8);
        ->     DECLARE bh_id CHAR(16);
        ->     DECLARE number INT;
        ->     DECLARE new_bh VARCHAR(16);
        ->
        ->     SET dt = DATE_FORMAT(CURDATE(),'%Y%m%d');
        ->
        ->     SELECT
        ->         MAX(BH) INTO bh_id
        ->     FROM tb
        ->     WHERE BH LIKE CONCAT(dt,'%');
        ->
        ->     IF bh_id = '' OR bh_id IS NULL THEN
        ->         SET new_bh = CONCAT(dt,'00000001');
        ->     ELSE
        ->         SET number = RIGHT(bh_id,8) + 1;
        ->         SET new_bh =  RIGHT(CONCAT('00000000',number),8);
        ->         SET new_bh=CONCAT(dt,new_bh);
        ->     END IF;
        ->
        ->     SET NEW.BH = new_bh;
        -> END$$
    Query OK, 0 rows affected (0.09 sec)mysql>
    mysql> DELIMITER ;
    mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);
    Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);
    Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);
    Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);
    Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);
    Query OK, 1 row affected (0.00 sec)mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);
    Query OK, 1 row affected (0.01 sec)mysql> INSERT INTO tb(content,`date`,val) VALUES('LiangCK','2009-05-11',20);
    Query OK, 1 row affected (0.00 sec)mysql> SELECT * FROM tb;
    +------------------+---------+---------------------+------+
    | BH               | content | date                | val  |
    +------------------+---------+---------------------+------+
    | 2009051100000001 | LiangCK | 2009-05-11 00:00:00 |   20 |
    | 2009051100000002 | LiangCK | 2009-05-11 00:00:00 |   20 |
    | 2009051100000003 | LiangCK | 2009-05-11 00:00:00 |   20 |
    | 2009051100000004 | LiangCK | 2009-05-11 00:00:00 |   20 |
    | 2011051200000001 | LiangCK | 2009-05-11 00:00:00 |   20 |
    | 2011051200000002 | LiangCK | 2009-05-11 00:00:00 |   20 |
    | 2011051200000003 | LiangCK | 2009-05-11 00:00:00 |   20 |
    +------------------+---------+---------------------+------+
    7 rows in set (0.00 sec)
      

  4.   

    本帖最后由 ACMAIN_CHM 于 2009-05-11 20:47:58 编辑
      

  5.   

    1、首先判断日期是否为当日,如是,数值自动增长1,否则从1开始;
    2、在网络上,用SELECT MAX FOR UPDATE,锁表,取得最大数+1,
    不过推荐用自增字段。
      

  6.   

    至于自增字段,,,,,,必须为主键,才可使用自增,,,,,项目开发规定:     主键统一为UUID32(),,,,,,,,
      

  7.   


    震惊!数据库个人认为不应该含逻辑业务层的东西。震惊1: 这种带日期的编号是老式传统的纸质的思想的延续,个人完全反对。个人经验中如果你真的用用户,用户反而说不出来什么为什么一定要用这种编号。
    震惊2: 以后一但不用MySQL,换另外 的数据库,那工作量几乎是推倒重来。
      

  8.   

    震惊2: 以后一但不用MySQL,换另外 的数据库,那工作量几乎是推倒重来。