【问题标题】:MySQL AUTO INCREMENT with Prefix (YYMM) that reset every month带有前缀(YYMM)的 MySQL AUTO INCREMENT 每月重置
【发布时间】:2015-03-01 23:23:14
【问题描述】:

我看到另一篇文章解释了使用序列表创建前缀 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')|

【问题讨论】:

  • 主键确实不需要特殊编码。只需使用自动递增的值。如果需要枚举一个月内的东西,查询的时候就可以了。

标签: mysql sql database auto-increment


【解决方案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

【讨论】:

    【解决方案2】:

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

    TRUNCATE TABLE table1_seq ;
    

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

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


    这回答了您提出的问题。附带说明一下,以这种方式生成键值通常不是一个好主意。

    【讨论】:

    • 感谢您的回复。然而,这意味着我必须实现从外部检查它的逻辑(通过 php 说)。有没有办法在 MySQL 中实现它?因此,外部应用程序只需要执行 INSERT 语句和 MySQL 自动处理的 ID 生成。
    • 我的意思是监控月份变化的过程需要在执行TRUNCATE命令之前在外部完成。有什么办法可以让mysql在内部完成整个过程吗?因此,外部应用程序只需要发出 INSERT 命令来添加记录。谢谢。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-03
      • 1970-01-01
      • 2013-09-09
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多