6

我有一个名为 > Project 的表,其中有一个用于项目估算投标号的自动增量字段,称为Project_ID.

该字段是自动递增的。我已将其创建为带有字段规则的 8 位字符字段。

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

以 2012 年 4 月为例,第一个记录为 1204-001,第二个记录为 1204-002,依此类推。然后当 5 月份滚动时,Project_ID 将更改为 1205-001。

我一直在尝试编写的内容如下,我将其保留为一个简单的默认表达式,默认值为

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

我是如何做到这一点的?

4

3 回答 3

1

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

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

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

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

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

分隔符;;

插入后创建触发器 ttry

对于每一行

开始

声明 v int;

声明 c int;

set v=(select max( project_id) from original);

如果(v=0)那么

插入original集合

project_id=concat((select concat(right(substring_index((select * from(select curdate() from trylimit 1) as a),'-','1'),2),right(substring_index((select * from(select curdate() 来自try限制 1) 作为 a),'-','2'),2)) 来自try限制 1),'-001'),

project=新的。project;

别的

set c=(select right((select max( project_id) from original)as x,3) from originallimit 1);

插入original集合

project_id=concat((select concat(right(substring_index((select * from(select curdate() from trylimit 1) as a),'-','1'),2),right(substring_index((select * from(select curdate() 从try限制 1) as a),'-','2'),2)) 从try限制 1),concat('-00',c+1)),

project=新的。project;

original从限制 1中删除;

万一;

结尾;;

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

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

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

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

于 2014-05-09T10:23:45.070 回答
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'));
于 2013-02-12T09:17:49.550 回答
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'

于 2013-02-12T09:25:45.860 回答