自动增量,包括MySql中的年份和月份

时间:2013-02-12 08:57:49

标签: java mysql

我有一个名为>的表项目具有自动增量字段,用于项目估算出价编号Project_ID

此字段自动递增。我创建了一个带有字段规则的8位字符字段。

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

  

2012年4月的一个例子是第一个月的1204-001   记录,1204-002为第二等等,然后当五月份滚动   Project_ID周围将更改为1205-001。

我一直在尝试写的内容如下,我把它保存为一个简单的默认表达式,默认值为

Cyear(date()) + (month()) + “-“ + “001” . 

我是如何实现这一目标的?

3 个答案:

答案 0 :(得分:1)

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

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

// 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'));

答案 1 :(得分:1)

我已经完全解决了,只需看看......

首先,您必须采用一个示例表,其中列与原始表的列相同,但列project_id除外。

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

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

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

分隔符;;

try

上插入后创建触发器t 每行

开始

声明v int;

声明c int;

设置v =(从project_id选择最大值(original);

如果(V = 0),则

插入original

project_id = concat((选择concat(右(substring_index((select * from(select try限制1中的curdate())a),' - ','1'), 2),right(substring_index((select * from(select curdate()from try limit 1)as a),' - ','2'),2))try限制1) , ' - 001'),

project = {新{1}};。

否则

设置c =(从project选择右侧((从project_id选择最大值(original)为x,3)original限制1);

插入original

project_id = concat((选择concat(右(substring_index((select * from(select try限制1中的curdate())a),' - ','1'), 2),right(substring_index((select * from(select curdate()from try limit 1)as a),' - ','2'),2))try限制1) ,CONCAT( ' - 00',C + 1)),

project = {新{1}};。

project限制1;

删除

结束if;

端;;

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

在上面的触发器中,我的示例表是 originaltry text),原始表格是 projectoriginal文字,project_id文字)

在示例表上创建这样的触发器后,开始在示例表中插入行,这些行将自动插入到原始表中,其中包含project列中的auto_increment值,如..1405-001,1405 -002,1405-003 ....其中project_id14201405,其余为auto_incremented值,使用触发器递增。

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

答案 2 :(得分:0)

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'

这个可能看起来有点奇怪,所以我只是解释一下这个流程:

我使用INSERT INTO ... SELECT,以便我可以检查table_name中的现有数据,看看是否已有任何现有案例。 WHERE会找到现有案例,并且由于RIGHTLEFT,所以创建所需的相关数据并不难。如果未找到任何行,则使用'001'代替,然后您只需分配现有列,如图所示。