Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL自动递增,前缀(YYMM),每月重置_Mysql_Sql_Database_Auto Increment - Fatal编程技术网

MySQL自动递增,前缀(YYMM),每月重置

MySQL自动递增,前缀(YYMM),每月重置,mysql,sql,database,auto-increment,Mysql,Sql,Database,Auto Increment,我看到另一篇文章解释了如何使用序列表来创建带前缀的自动递增ID 我需要生成的自动增量格式为:YYMM+每月重置的自动增量值。例如,现在是2015年1月。生成的id应为:15011、15012、15013等。下个月2015年2月,生成的id应为:15021、15022、15023等。我可以使用上述方法生成前缀,但如何每月重置自动增量值?数据库是InnoDB。任何帮助都将不胜感激:) 修改代码 CREATE TABLE table1_seq ( id INT NOT NULL AUTO_INC

我看到另一篇文章解释了如何使用序列表来创建带前缀的自动递增ID

我需要生成的自动增量格式为:YYMM+每月重置的自动增量值。例如,现在是2015年1月。生成的id应为:15011、15012、15013等。下个月2015年2月,生成的id应为:15021、15022、15023等。我可以使用上述方法生成前缀,但如何每月重置自动增量值?数据库是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')|

要重置自动增量值,请删除并重新创建
table1\u seq
表。在您的示例中,TRUNCATE语句就足够了(假设没有任何外键,并且我们假设该表使用MyISAM或InnoDB引擎)

(此语句的MySQL行为是创建一个新的空表,自动增量设置回创建表时的值。)

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



这回答了你的问题。作为补充说明,以这种方式生成键值通常不是一个好主意。

如果表中有字段日期或日期时间,则此解决方案可能会对您有所帮助

让我们说出您的表名
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
我根据上面的最后一个答案,使用了表中的orderDate字段,并在插入期间将其与当前日期进行比较,以最终决定是重置还是增加purchaseOrderRef字段: 目的是在表[Products\u 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
使用[Mydatabase]——这里您需要使用自己的数据库
去
/******对象:触发器[dbo]。[customAutoIncrement]脚本日期:10/1/2016 10:07:41 PM******/
将ANSI_空值设置为ON
去
在上设置带引号的\u标识符
去
创建触发器[dbo]。[customAutoIncrement]
关于[dbo].[Products\u Sumu Orders]
插入后
作为
开始
不计数;
声明@maxOrderID int;
声明@maxOrderRef nvarchar(最大值);
声明@relativeID varchar(最大值);
声明@orderId int;
选择@orderId=orderId from inserted;
打印(@orderId)--允许我显示插入的订单id
设置@maxOrderID=(从[Products_SumOrders]中选择Max(orderid),其中月([OrderDate])=(月(GETDATE())和年([OrderDate])=年(GETDATE())和orderid<@orderid);
打印(@maxOrderID)--最后添加的订单
--自定义月份格式(始终为MM):
声明@monint;
声明@stringMon nvarchar(10);
设置@mon=MONTH(GETDATE());

如果@mon真的没有必要对主键进行特殊编码。只需使用自动递增的值。如果您需要在一个月内列举一些事情,您可以在查询时进行。谢谢您的回复。然而,这意味着我必须实现外部检查的逻辑(通过php)。有没有办法在MySQL中实现它?因此,外部应用程序只需要执行INSERT语句和MySQL自动处理的ID生成,我的意思是在执行TRUNCATE命令之前,需要在外部完成监视月份变化的过程。有没有办法让mysql在内部完成整个过程?因此,外部应用程序只需发出INSERT命令即可添加记录。谢谢
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
    );
    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