添加'1'返回“BLOB”

时间:2012-11-18 12:19:08

标签: mysql blob

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首字母和当前日期连接起来。

3 个答案:

答案 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。当您想要将数据放入有序组时,这非常有用。

在你的情况下:

  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)
    ;
    
  4. 然后,您可以根据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功能。