型付表の定義
DB2 で型付表を作ろうとするときに必要な手順を、いつもいつも忘れるのでメモ。
まぁ、DB2のオンラインマニュアルには書いてあるんだけど‥探すといつも見つからない‥(ちなみに、キーワード「CREATE SEQUENCE」で探すと何番目かに出てくる。)
CREATE TYPE "TYPE_HOGE" AS ( COL_A INTEGER, COL_B VARCHAR(8), COL_C TIMESTAMP ) REF USING BIGINT MODE DB2SQL ! CREATE TABLE "TABLE_HOGE" OF "TYPE_HOGE" (REF IS "COL_REF" USER GENERATED) ! CREATE SEQUENCE "SEQ_HOGE" AS REF("TYPE_HOGE") START WITH -9223372036854775808 INCREMENT BY 1 NO MAXVALUE NO CYCLE ! CREATE TRIGGER "TRIGGER_HOGE" BEFORE INSERT ON "TABLE_HOGE" REFERENCING NEW AS nwr FOR EACH ROW BEGIN SET nwr.COL_REF = NEXTVAL FOR "SEQ_HOGE"; END !
CREATE TRIGGER 文にセミコロン(';')が入っているので、セパレータ文字をエクスクラメーションマーク('!')にしている。これをファイルに保存して実行する場合は次のようにする。
db2 -td! -vf test.sql
で、生成したテーブルに行を挿入。
INSERT INTO "TABLE_HOGE"(COL_A, COL_B, COL_C) VALUES(1, 'hello', CURRENT_TIMESTAMP) ! INSERT INTO "TABLE_HOGE"(COL_A, COL_B, COL_C) VALUES(1, 'hello', CURRENT_TIMESTAMP) ! INSERT INTO "TABLE_HOGE"(COL_A, COL_B, COL_C) VALUES(1, 'hello', CURRENT_TIMESTAMP) ! INSERT INTO "TABLE_HOGE"(COL_A, COL_B, COL_C) VALUES(1, 'hello', CURRENT_TIMESTAMP) ! SELECT * FROM "TABLE_HOGE" !
挿入されたデータはこんな感じ。
COL_REF COL_A COL_B COL_C -------------------- ----------- -------- -------------------------- -9223372036854775808 1 hello 2009-11-24-02.02.49.778000 -9223372036854775807 1 hello 2009-11-24-02.02.49.791000 -9223372036854775806 1 hello 2009-11-24-02.02.49.804000 -9223372036854775805 1 hello 2009-11-24-02.02.49.817000
問題点は、
- 生成できる ID が 18,446,744,073,709,551,615 個に限られる。
- もちろん、BIGINT ではなく INT や SMALLINT を使うと、生成できる ID はもっと少なくなってしまう。
ちなみに‥
マニュアル上は、"USER GENERATED" しかサポートされていないと書いてあるが、"SYSTEM GENERATED" と書いても CREATE TABLE 文はエラーなく終了するが、システムは OID を生成してはくれない‥