2

JobID 如下所示:ALC-YYYYMMDD-001。前三个是公司的首字母缩写,后三个是一个递增的数字,每天重置,并且随着工作的增加,一天内最多增加 999 个工作;我正在尝试使用的正是这最后三个。

我正在尝试获取一个插入前触发器来查找当天的最大 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 首字母缩写和当前日期连接起来。

4

3 回答 3

1

尝试将 VARCHAR 转换回 INTEGER

SELECT lpad(SELECT (COALESCE(@maxjobID,0, CAST(@maxjobID AS SIGNED)) + 1),3,'0')
于 2012-11-18T12:23:58.377 回答
0

如果您使用的是 MyISAM 存储引擎,则可以使用 完全实现这一点AUTO_INCREMENT,而无需将数据非规范化为分隔字符串:

对于MyISAM表,您可以AUTO_INCREMENT在多列索引中的辅助列上指定。在这种情况下,AUTO_INCREMENT列的生成值计算为。当您要将数据放入有序组时,这很有用。MAX(auto_increment_column) + 1 WHERE prefix=given-prefix

在你的情况下:

  1. 规范化您的架构:

    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,
    ;
    
  2. 规范化现有数据:

    UPDATE jobs SET
      initials = SUBSTRING_INDEX(JobID, '-',  1),
      date     = STR_TO_DATE(SUBSTRING(JobID, 5, 8), '%Y%m%d'),
      seq      = SUBSTRING_INDEX(JobID, '-', -1)
    ;
    
  3. 设置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(甚至从此类查询创建视图):

SELECT CONCAT_WS(
         '-',
         initials,
         DATE_FORMAT(date, '%Y%m%d'),
         LPAD(seq, 3, '0')
       ) AS JobID,
       -- etc.

如果您使用的是 InnoDB,虽然您无法以这种方式生成序列号,但我仍然建议您如上所述规范化您的数据。

于 2012-11-18T13:07:51.370 回答
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')));

感谢您的回复!特别是指出 MyISAM 中的 auto_increment 功能。

于 2012-11-19T06:22:03.943 回答