希望mysql自动增量表为订单号 - MCI-YYMMDD001和001将从每天001开始

时间:2016-06-06 08:50:19

标签: mysql

  

我用过

CREATE TABLE BOOKING(ORDER_NO VARCHAR(13) NOT NULL PRIMARY KEY DEFAULT '0';
CREATE TRIGGER TG_BOOKING BEFORE INSERT ON BOOKING FOR EACH ROW BEGIN
INSERT INTO BOOKING_SEQ VALUES (NULL);
  

我需要每天从001开始序列

SET NEW.ORDER_NO = CONCAT('MCI-',DATE_FORMAT(NOW(),'%y%m%d'),LPAD(LAST_INSERT_ID(),3,'0'));END;

1 个答案:

答案 0 :(得分:0)

这是一种方式......

首先,一些DDL ......

DROP TABLE IF EXISTS my_table;

CREATE TABLE my_table (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,invoice_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,public_id VARCHAR(30) NOT NULL);

步骤1.为订单/发票创建占位符...

INSERT INTO my_table (invoice_date) VALUES (NULL);

SELECT * FROM my_table;
+----+---------------------+--------------+
| id | invoice_date        | public_id    |
+----+---------------------+--------------+
|  1 | 2016-06-06 10:29:29 |              |
+----+---------------------+--------------+

步骤2.更新结果......

UPDATE my_table a
  JOIN 
     ( SELECT x.*
            , COUNT(*) total
         FROM my_table x 
         JOIN my_table y 
           ON DATE(y.invoice_date) = DATE(x.invoice_date) 
          AND y.invoice_date <= x.invoice_date 
        GROUP 
           BY id
     ) b
    ON b.id = a.id
   SET a.public_id = CONCAT(DATE_FORMAT(a.invoice_date,'%Y%m%d'),'-',LPAD(b.total,3,0));

SELECT * FROM my_table;
+----+---------------------+--------------+
| id | invoice_date        | public_id    |
+----+---------------------+--------------+
|  1 | 2016-06-06 10:29:29 | 20160606-001 |
+----+---------------------+--------------+

现在,插入下一个订单/发票......

INSERT INTO my_table (id,invoice_date) VALUES (5,NULL);

SELECT * FROM my_table;
+----+---------------------+--------------+
| id | invoice_date        | public_id    |
+----+---------------------+--------------+
|  1 | 2016-06-06 10:29:29 | 20160606-001 |
|  5 | 2016-06-06 10:30:57 |              |
+----+---------------------+--------------+

...并重复......

UPDATE my_table a
  JOIN
     ( SELECT x.*
            , COUNT(*) total
         FROM my_table x
         JOIN my_table y
           ON DATE(y.invoice_date) = DATE(x.invoice_date)
          AND y.invoice_date <= x.invoice_date
        GROUP
           BY id
     ) b
    ON b.id = a.id
   SET a.public_id = CONCAT(DATE_FORMAT(a.invoice_date,'%Y%m%d'),'-',LPAD(b.total,3,0));

SELECT * FROM my_table;
+----+---------------------+--------------+
| id | invoice_date        | public_id    |
+----+---------------------+--------------+
|  1 | 2016-06-06 10:29:29 | 20160606-001 |
|  5 | 2016-06-06 10:30:57 | 20160606-002 |
+----+---------------------+--------------+

这些步骤(1和2)可以绑定到事务中,这样如果步骤2失败,那么步骤1也会这样做。但是,我怀疑有一种方法可以将其重写为单个查询。