パンプキンスパイスラテ

IT系のことが多めの日記帳です

INSERT時にカラムの最大値+1を持ってくる

AUTO INCREMENTを使えば済む話かもしれないけど、他のテーブルのカラムを参考にする場合などに役立つかも。ただ実際はTRANSACTIONでロックを掛けないとヤバイことになるので注意。

【パターン1】◎推奨

INSERT INTO テーブルA
  (カラムA, カラムB, カラムC)
  SELECT
  値, 値, MAX(カラムC) + 1
  FROM テーブルB;

INSERT INTO テーブルA
  (カラムA, カラムB, カラムC)
  SELECT
  値, 値,
  CASE
    WHEN MAX(カラムC) IS NULL THEN 1
    ELSE MAX(カラムC)+1
  END
  ,
  FROM テーブルB;

※テーブルAとテーブルBは、同じものでも異なるものでも構わない。

【パターン2】

DECLARE @MAX INT
SELECT @MAX = カラムC FROM テーブルB
INSERT INTO テーブルA
  (カラムA, カラムB, カラムC)
  VALUES
  (値, 値, @MAX+1);

DECLARE @MAX INT
SELECT @MAX = カラムC FROM テーブルB
INSERT INTO テーブルA
  (カラムA, カラムB, カラムC)
  VALUES
  (値, 値,
  CASE
    WHEN @MAX IS NULL THEN 1
    ELSE @MAX+1
  END
  );

※テーブルAとテーブルBは、同じものでも異なるものでも構わない。

INSERTって実は2通りのやり方があるらしい。

(1)insert into 表名[(列名,列名,...)] values(値,値,...)
(2)insert into 表名[(列名,列名,...)] select文

http://oshiete1.goo.ne.jp/qa2982740.html

(1)しか知らなかった・・・。覚えておこう。


★20080123修正しました。
DBがまっさらな状態の時を考えてなかったので、データがNULLだったら1を代入させました。