我有一个名为>的表项目具有自动增量字段,用于项目估算出价编号Project_ID
。
此字段自动递增。我创建了一个带有字段规则的8位字符字段。
我需要它自动递增为两个数字年,两个数字月,包括一个连字符,然后是一个从 001 开始的数字,作为该时间段内的第一个记录。
2012年4月的一个例子是第一个月的1204-001 记录,1204-002为第二等等,然后当五月份滚动 Project_ID周围将更改为1205-001。
我一直在尝试写的内容如下,我把它保存为一个简单的默认表达式,默认值为
Cyear(date()) + (month()) + “-“ + “001” .
我是如何实现这一目标的?
答案 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
开始
声明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;
端;;
/////////////////////////////////////////////// ////////////////////////////////////////////////// ////////////////////////////////////////////////// //////////////////
在上面的触发器中,我的示例表是 original
(try
text),原始表格是 project
(original
文字,project_id
文字)。
在示例表上创建这样的触发器后,开始在示例表中插入行,这些行将自动插入到原始表中,其中包含project
列中的auto_increment值,如..1405-001,1405 -002,1405-003 ....其中project_id
为14
且2014
为05
,其余为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
会找到现有案例,并且由于RIGHT
和LEFT
,所以创建所需的相关数据并不难。如果未找到任何行,则使用'001'
代替,然后您只需分配现有列,如图所示。