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

希望mysql自动增量表为订单号-MCI-YYMMDD001,001每天从001开始,mysql,Mysql,我曾经 我需要每天从001开始 这里有一个方法 首先,一些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); 第一步。为订单/发票创建占位符 INSERT INTO my_table

我曾经

我需要每天从001开始

这里有一个方法

首先,一些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);
第一步。为订单/发票创建占位符

INSERT INTO my_table (invoice_date) VALUES (NULL);

SELECT * FROM my_table;
+----+---------------------+--------------+
| id | invoice_date        | public_id    |
+----+---------------------+--------------+
|  1 | 2016-06-06 10:29:29 |              |
+----+---------------------+--------------+
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 |
+----+---------------------+--------------+
…然后重复

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也会失败。然而,我怀疑有一种方法可以将其重写为单个查询。

这里有一种方法

首先,一些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);
第一步。为订单/发票创建占位符

INSERT INTO my_table (invoice_date) VALUES (NULL);

SELECT * FROM my_table;
+----+---------------------+--------------+
| id | invoice_date        | public_id    |
+----+---------------------+--------------+
|  1 | 2016-06-06 10:29:29 |              |
+----+---------------------+--------------+
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 |
+----+---------------------+--------------+
…然后重复

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也会失败。然而,我怀疑有一种方法可以将其重写为一个查询。

实际上不太可能需要存储此信息。好的,在php中,当用户输入html数据并自动生成一个订单时,是否有任何方法,如MCI-YYMMDD001,我想001每天都从001开始。请注意,如果您的竞争对手掌握了这一点,那么他们将对您一天生成的订单数量有一个大致的了解。您实际上不太可能需要存储这一点。好的,在php中,当用户输入html数据并自动生成订单时,是否有任何方法,如MCI-YYMMDD001,我猜001将每天从001开始。请注意,如果您的竞争对手掌握了这一点,那么他们将对您一天生成的订单数量有一个合理的了解。