ジェネレーターの番号をトリガーを使って採番してみます。
他にもやり方がありますが、その一部を紹介。
これが最大効率かどうかは疑わしいですが、とりあえず動いています。
はじめに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)へ自動採番されます。
トリガの扱いは様々な思考があって他にもやり方があります。遊んでみると面白いですよ。
|