JobID如下:ALC-YYYYMMDD-001。前三个是公司的首字母缩写,后三个是递增的数字,每天重复,并在一天内增加,因为一天最多增加999个工作岗位;正是这三个我正在尝试合作。
我正在尝试使用before-insert触发器来查找当天的最大JobID,并添加一个以便我可以让触发器派生正确的JobID。对于第一份工作,它当然会返回null。所以这就是我到目前为止所做的。
通过以下我可以得到'000'的结果。
set @maxjobID =
(select SUBSTRING(
(Select MAX(
SUBSTRING((Select JobID FROM jobs WHERE SUBSTRING(JobID,5,8)=date_format(curdate(), '%Y%m%d')),4,12)
)
),14,3)
);
select lpad((select ifnull(@maxjobID,0)),3,'0')
但我真的需要添加一个,以保持前导零增加当天的第一个和后续的工作。我的问题是,一旦尝试添加'1'我就会得到'BLOB'的回报。那就是:
select lpad((select ifnull(@maxjobID,0)+1),3,'0')
返回'BLOB'
我需要它返回'001'所以我可以将结果与CO首字母和当前日期连接起来。
答案 0 :(得分:1)
尝试将VARCHAR转换回INTEGER
SELECT lpad(SELECT (COALESCE(@maxjobID,0, CAST(@maxjobID AS SIGNED)) + 1),3,'0')
答案 1 :(得分:0)
如果您正在使用MyISAM存储引擎,则可以使用AUTO_INCREMENT
实现此目的,而不会将数据非规范化为分隔字符串:
对于
MyISAM
表,您可以在多列索引的辅助列上指定AUTO_INCREMENT
。在这种情况下,AUTO_INCREMENT
列的生成值计算为MAX(auto_increment_column) + 1 WHERE prefix=given-prefix
。当您想要将数据放入有序组时,这非常有用。
在你的情况下:
规范您的架构:
ALTER TABLE jobs
ADD initials CHAR(3) NOT NULL FIRST,
ADD date DATE NOT NULL AFTER initials,
ADD seq SMALLINT(3) UNSIGNED NOT NULL AFTER date,
;
规范化现有数据:
UPDATE jobs SET
initials = SUBSTRING_INDEX(JobID, '-', 1),
date = STR_TO_DATE(SUBSTRING(JobID, 5, 8), '%Y%m%d'),
seq = SUBSTRING_INDEX(JobID, '-', -1)
;
设置AUTO_INCREMENT
:
ALTER TABLE jobs
DROP PRIMARY KEY,
DROP JobID,
MODIFY seq SMALLINT(3) UNSIGNED NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY(initials, date, seq)
;
然后,您可以根据JobID
的要求重新创建SELECT
(甚至可以从此类查询中创建view):
SELECT CONCAT_WS(
'-',
initials,
DATE_FORMAT(date, '%Y%m%d'),
LPAD(seq, 3, '0')
) AS JobID,
-- etc.
如果你正在使用InnoDB,虽然你不能以这种方式生成序列号,但我仍然建议按上述方式对数据进行标准化。
答案 2 :(得分:0)
所以,我找到了一个有效的查询(到目前为止)。
Declare maxjobID VARCHAR(16);
Declare jobincrement SMALLINT;
SET maxjobID =
(Select MAX(
ifnull(SUBSTRING(
(Select JobID FROM jobs WHERE SUBSTRING(JobID,5,8)=date_format(curdate(), '%Y%m%d')),
5,
12),0)
)
);
if maxjobID=0
then set jobincrement=1;
else set jobincrement=(select substring(maxjobID,10,3))+1;
end if;
Set NEW.JobID=concat
(New.AssignedCompany,'-',date_format(curdate(), '%Y%m%d'),'-',(select lpad(jobincrement,3,'0')));
感谢您的回复!特别是eggyal指出MyISAM中的auto_increment功能。