2

JobID は次のようになります: ALC-YYYYMMDD-001。最初の 3 つは会社のイニシャルで、最後の 3 つは増加する数字で、毎日リセットされ、1 日に最大 999 件のジョブが追加されると 1 日を通して増加します。私が作業しようとしているのは、これらの最後の 3 つです。

挿入前のトリガーを取得して、その日の最大 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 を追加する必要があります。私の問題は、「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 に答える