3 generatorとTRIGGERで自動採番

ジェネレーターの番号をトリガーを使って採番してみます。

他にもやり方がありますが、その一部を紹介。

これが最大効率かどうかは疑わしいですが、とりあえず動いています。

はじめにIBConsoleでテーブルを作成します。

CREATE TABLE MST_TEST
(
KEY1 INTEGER NOT NULL,
IDNUM VARCHAR(100),
LTIME TIMESTAMP,
PRIMARY KEY (KEY1)
);

次もIBConsoleでジェネレータをつくります。

ジェネレーター名は「TESTNO」としています。
create generator TESTNO;

次はトリガを作ります。


SET TERM !! ;
CREATE TRIGGER TRG_ID FOR MST_TEST
BEFORE INSERT POSITION 0 AS
BEGIN
NEW.KEY1 = GEN_ID(TESTNO, 1);
END!!
SET TERM ; !!

「TRG_ID」が今回作成したトリガです。

「MST_TEST」にトリガを作成しました。

GEN_ID(TESTNO, 1)のTESTNOが先ほど作ったジェネレータの名前を入れていきます。

「NEW.KEY1」にジェネレータから持ってきた番号が入ります。

次はdelphiのSQLクエリに書いていきます。

DM1.IBQuery1.SQL.Clear;
DM1.IBQuery1.Close;
ltrg := DM1.IBQuery1.SQL.Add('ALTER TRIGGER TRG_ID');//トリガ発動
DM1.IBQuery1.Open;

DM1.IBQuery1.SQL.Clear;
DM1.IBQuery1.SQL.Add('INSERT INTO MST_TEST');
DM1.IBQuery1.SQL.Add('(');
DM1.IBQuery1.SQL.Add(' KEY1,');
DM1.IBQuery1.SQL.Add(' IDNUM,');
DM1.IBQuery1.SQL.Add(' LTIME');
DM1.IBQuery1.SQL.Add(')');
DM1.IBQuery1.SQL.Add('VALUES');
DM1.IBQuery1.SQL.Add('(');
DM1.IBQuery1.SQL.Add(' :KEY1,');
DM1.IBQuery1.SQL.Add(' :IDNUM,');
DM1.IBQuery1.SQL.Add(' :LTIME');
DM1.IBQuery1.SQL.Add(');');
DM1.IBQuery1.Close;
DM1.IBQuery1.ParamByName('KEY1').AsInteger := ltrg;//ここにトリガ。
DM1.IBQuery1.ParamByName('IDNUM').AsInteger := 1;
DM1.IBQuery1.ParamByName('LTIME').AsDateTime := now;
DM1.IBQuery1.Open;

これでジェネレータの数値がトリガによってMST_TABLEの(KEY1)へ自動採番されます。

トリガの扱いは様々な思考があって他にもやり方があります。遊んでみると面白いですよ。

back