2015-01-04 65 views
1

我看到另一篇文章解釋使用序列表來創建前綴AUTO INCREMENT ID。MySQL自動增量與前綴(YYMM),每月重置

Link to referenced post

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

我需要自動生成增量格式爲:每個月復位YYMM + AUTO增量值。例如,現在是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

要重置AUTO_INCREMENT值,刪除並重新創建table1_seq表。以您的示例爲例,TRUNCATE語句就足夠了(因爲沒有任何外鍵,並且我們假定該表使用的是MyISAM或InnoDB引擎)。

TRUNCATE TABLE table1_seq ; 

(該語句MySQL的行爲是創建一個新的空表,設置回當桌被創造的價值AUTO_INCREMENT。)

這有效地實現了相同的結果DROP表格依次爲CREATE表格。


這會回答您提問的問題。作爲一個側面說明,通過這種方式產生一個關鍵值通常是一個糟糕的主意。

+0

謝謝你的回覆。但是這意味着我必須實現檢查它的邏輯(通過php說)。有沒有辦法在MySQL中實現它?因此,外部應用程序只需執行INSERT語句並由MySQL自動處理ID生成。 –

+0

我的意思是在執行TRUNCATE命令之前,需要在外部完成監視月份變化的過程。有沒有辦法讓整個過程可以由mysql在內部完成?因此,外部應用程序只需要發出INSERT命令來添加記錄。謝謝。 –

1

如果您的表中有DATE或DATETIME字段,那麼此解決方案可能會對您有所幫助。

假設您的表名稱爲my_table,並且具有PK id (INT)以及字段bila (DATE)。我只需要得到最後一個(最大的)ID當月從my_table然後通過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 
    ); 

添加然後u可以使用在接下來的查詢

0

我已經依靠最後的答案以上@mos,我已經使用了我的表中的orderDate字段,並將其與插入期間的當前日期進行比較,以最終決定是否要重置或增加purchaseOrderRef字段: 目標是插入自定義自動遞增訂單ID(字段名稱: 「purchaseOrderRef」),格式爲DD-MM-XXX表[Products_SumOrders]。以便每月自動將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 [email protected]); 
      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