MySQL AUTO INCREMENT带有每月重置的前缀(YYMM)

时间:2015-01-04 04:18:49

标签: mysql sql database auto-increment

我看到另一篇文章解释了使用序列表来创建前缀的AUTO INCREMENT ID。

Link to referenced post

SQL Fiddle
http://sqlfiddle.com/#!2/0ed88/1

我需要生成的自动增量格式为:每月重置的YYMM + AUTO INCREMENT VALUE。例如现在是2015年1月。生成的id应该是:15011,15012,15013等。下个月2015年2月,生成的id应该是:15021,15022,15023等。我可以使用上面的方法来生成前缀,但是如何每月重置AUTO INCREMENT值?数据库是InnoDB。任何帮助将不胜感激:)

修改后的代码

CREATE TABLE table1_seq
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY
)|

CREATE TABLE Table1
(
  id VARCHAR(7) NOT NULL PRIMARY KEY DEFAULT '0', name VARCHAR(30)
)|


CREATE TRIGGER tg_table1_insert
BEFORE INSERT ON table1
FOR EACH ROW
BEGIN
  INSERT INTO table1_seq VALUES (NULL);
  SET NEW.id = CONCAT(DATE_FORMAT(NOW(),'%y%m'), LAST_INSERT_ID());
END |


INSERT INTO Table1 (name) VALUES ('Jhon'), ('Mark')|

3 个答案:

答案 0 :(得分:1)

如果您的表格中有DATE或DATETIME字段,那么此解决方案可能会对您有所帮助。

请说出您的表格名称my_table并拥有PK id (INT)以及字段bila (DATE)。我只需要从my_table获得当前月份的最后一个(最大)ID,然后加1。

SET @mos= (SELECT MAX(id) FROM my_table WHERE MONTH(`bila`) = MONTH(NOW()) AND YEAR(`bila`) = YEAR(NOW()));

SET @mos = IF(
    @mos IS NULL,
    CONCAT(YEAR(NOW()),MONTH(NOW()),'001'),
    @mos + 1
    );

然后您可以在查询中使用@mos

答案 1 :(得分:0)

要重置AUTO_INCREMENT值,请删除并重新创建table1_seq表。举个例子,TRUNCATE语句就足够了(假设没有任何外键,我们假设该表使用的是MyISAM或InnoDB引擎)。

TRUNCATE TABLE table1_seq ;

(此语句的MySQL行为是创建一个新的空表,其中AUTO_INCREMENT设置回创建表时的值。)

这有效地实现了与DROP表后面跟CREATE表相同的结果。


这回答了你问的问题。作为旁注,以这种方式生成关键值通常是一个坏主意。

答案 2 :(得分:0)

我依靠上面的最后一个答案,我已经使用了我的表中的orderDate字段,并将其与插入时的当前日期进行了比较,最终决定是否要重置或增加purchaseOrderRef字段: 目的是在表[Products_SumOrders]中插入格式为DD-MM-XXX的自定义自动增量订单ID(字段名称:" purchaseOrderRef")。这样它每个月自动将XXX重置为0:

    USE [Mydatabase] -- here you need to use your own database
    GO

    /****** Object:  Trigger [dbo].[customAutoIncrement]    Script Date: 10/1/2016 10:07:41 PM ******/

        SET ANSI_NULLS ON
        GO

        SET QUOTED_IDENTIFIER ON
        GO

         CREATE TRIGGER [dbo].[customAutoIncrement]
         ON [dbo].[Products_SumOrders]
        AFTER INSERT
        AS 
        BEGIN
            SET NOCOUNT ON;
            declare @maxOrderID int;
            declare @maxOrderRef nvarchar(max);
            declare @relativeID varchar(max);
            declare @orderId int;
            select @orderId =orderid from inserted;
            print(@orderId);--allow me to display the inserted order id
            SET @maxOrderID = (SELECT Max(orderid) FROM [Products_SumOrders] WHERE MONTH([OrderDate]) = (MONTH(GETDATE())) AND YEAR([OrderDate]) = YEAR(GETDATE()) and orderid < @orderId );
                print(@maxOrderID);--last added order
    --custom month format (always MM):
                declare @mon int;
                declare @stringMon nvarchar(10);
                set @mon= MONTH(GETDATE());
                IF @mon <10
                set @stringMon ='0' +  CONVERT(VARCHAR(1),@mon) ;
                ELSE
                set @stringMon = CONVERT(VARCHAR(2),@mon) ;
            IF @maxOrderID is null --no orders has been added in this month:
            begin
                set @maxOrderRef =  Substring(CONVERT(VARCHAR(4),YEAR(GETDATE())),3,4)+ '-'+  CONVERT(VARCHAR(2),@stringMon)+'-001';
            end
            ELSE
--custom order id format (always XXX):
            begin
            set @relativeID =(SELECT [purchaseOrderRef] FROM [Products_SumOrders] WHERE orderid=@maxOrderID);
            set @relativeID = Substring(@relativeID,LEN(@relativeID)-(Charindex('-', REVERSE(@relativeID))-2),LEN(@relativeID));
            print(CONVERT(int,@relativeID));
            IF CONVERT(int,@relativeID) < 9
                set @relativeID ='00' +  CONVERT(VARCHAR(2),@relativeID+1) ;
                ELSE
                begin
                if CONVERT(int,@relativeID) < 99
                set @relativeID ='0' +  CONVERT(VARCHAR(3),@relativeID+1) ;
                else
                set @relativeID = CONVERT(VARCHAR(3),@relativeID+1) ;
                end
            set @maxOrderRef =  Substring(CONVERT(VARCHAR(4),YEAR(GETDATE())),3,4)+ '-'+  CONVERT(VARCHAR(2),@stringMon)+'-'+ CONVERT(VARCHAR(3),@relativeID);
            end
            print(@maxOrderRef);
            UPDATE Products_SumOrders
            SET purchaseOrderRef =  @maxOrderRef
            FROM inserted  INNER JOIN [Products_SumOrders]  On inserted.orderid = [Products_SumOrders].orderid
        END 

        GO