Java MySql中包含年和月的自动增量

Java MySql中包含年和月的自动增量,java,mysql,Java,Mysql,我有一个名为>Project的表,其中有一个名为Project_ID的项目估算投标编号的自动递增字段 此字段是自动递增的。我将其创建为一个8位字符的字段,其中包含字段规则 我需要它自动递增为两个数字年,两个数字月,包括一个连字符,然后是一个从001开始的数字,作为该时间段的第一个记录 2012年4月的第一个月的示例为1204-001 记录,1204-002,用于第2个月等,然后在5月滚动时 在项目周围,ID将更改为1205-001 我一直试图写的如下,我把它作为一个简单的默认表达式,默认值为 C

我有一个名为>Project的表,其中有一个名为Project_ID的项目估算投标编号的自动递增字段

此字段是自动递增的。我将其创建为一个8位字符的字段,其中包含字段规则

我需要它自动递增为两个数字年,两个数字月,包括一个连字符,然后是一个从001开始的数字,作为该时间段的第一个记录

2012年4月的第一个月的示例为1204-001 记录,1204-002,用于第2个月等,然后在5月滚动时 在项目周围,ID将更改为1205-001

我一直试图写的如下,我把它作为一个简单的默认表达式,默认值为

Cyear(date()) + (month()) + “-“ + “001” . 
我是如何做到这一点的?

基本上,您可以在希望增加列的表上使用BEFORE INSERT触发器

以下是创建简单算法并将此代码放入触发器的一些步骤:

// get current YEAR
SET @cur_Year = CONCAT(DATE_FORMAT(CURDATE(), '%Y'));
// get current MONTH
SET @cur_MONTH = CONCAT(DATE_FORMAT(CURDATE(), '%m'));
// concatenate YEAR and MONTH
SET @Year_Month = CONCAT(@cur_Year, @cur_MONTH);
// get the last value for the current YEAR and MONTH
SET @max_ID = ( SELECT MAX(ID) 
                FROM    tableName 
                WHERE   ID LIKE CONCAT(@Year_Month, '-%'));
// get the last three characters from the id, convert in to
// integer and increment by 1
SET @last_ID = CAST(RIGHT(@max_ID, 3) AS SIGNED) + 1;
// pad zero on the left using LPAD and 
// concatenate it with YEAR and MONTH
SET @new_ID =   CONCAT(@Year_Month,'-',LPAD(CAST(@last_ID AS CHAR(3)), 3, '0'));
这看起来可能有点奇怪,因此我将仅解释流程:


我使用插入到。。。选择此选项,以便我可以检查表_name中的现有数据,以查看是否已经存在任何现有案例。WHERE将找到现有案例,多亏了左右双方的支持,不难找到所需的相关数据。如果没有找到行,则使用“001”,然后您只需分配现有列,如图所示。

我已经完全解决了这个问题,请看一看

首先,您必须获取一个示例表,其中的列将与原始表中的列相同,但列项目id除外

然后首先在原始表中插入一行,其中列project_id=0的值和其他列为null,只需像这样手动插入第一行

然后在示例表上创建一个触发器,如下所示

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

分隔符

在尝试插入后创建触发器t

每行

开始

声明v int

声明c int

set v=从原始项目中选择maxproject\u id

ifv=0时

插入原始集合

project_id=concatselect concatrightsubstring_indexselect*from选择try limit 1中的curdate作为''-','1',2,rightsubstring_indexselect*from选择try limit 1中的curdate作为'-','2',从try limit 1'-001'

project=new.project

否则

设置c=选择右侧从原始x中选择maxproject_id,从原始限制1中选择3

插入原始集合

project_id=concatselect concatrightsubstring_indexselect*from选择try limit 1中的curdate作为一个“,”1',2,rightsubstring_indexselect*from选择try limit 1中的curdate作为一个“,”2',从try limit 1,concat'-00',c+1

project=new.project

从原来的限额1中删除

如果结束

完;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

在上面的触发器中,我的示例表是tryproject text,原始表是originalproject_id text,project text

在样本表上创建类似这样的触发器后,开始在样本表中插入行,这些行将自动插入原始表中,并在项目id列中使用自动增量值,如..1405-0011405-0021405-003。。。。其中14为2014年,05为5月,其余为使用触发器递增的自动递增值


只需按照上述步骤操作,您的问题肯定会得到解决。

存储过程,或使用Perl、Java或C等编程语言进行插入。至少,您需要1选择maxProject\u id,2确定是相同的月/年还是不同的月/年,3获取年/月代码,4计算索引-001,-002,etc和5插入结果Project_id值以及与此记录相关的其余字段。IMHO…是的,MySql中没有内置机制允许这样做。按照@paulsm4Stored函数获取下一个项目ID。
INSERT INTO (Project_ID, col1, col2, col3)
SELECT DATE_FORMAT(NOW(), CONCAT('%y%m-', 
    ((  SELECT RIGHT(CONCAT('000', (RIGHT(Project_ID, 3) + 1)), 3) AS number
        FROM table_name
        WHERE LEFT(Project_ID, 5) = DATE_FORMAT(NOW(), '%y%m-'))
        ORDER BY Project_ID DESC
        UNION
    (   SELECT '001')
        LIMIT 1))),
'Col1 data', 'Col2 data', 'Col3 data'