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