SSブログ

Firebird3 の新しい Identity カラム [Firebird]

これは Firebird Advent Calendar 2015 の http://qiita.com/advent-calendar/2015/firebird 16 日目の記事で、昨日の木村さんのエントリー http://blog.kimuradb.com/?eid=877448 の続きです

Interbase/Firebird を開発していた人たちは、オートインクリメントする型というのは、リレーショナルデーターベースの理論から外れるからということからか、導入に消極的だったように思います。

Firebird 1.x(Interbase 6.0)では、generator という整数列を生成するオブジェクトから trigger で値を設定するのが一般的でした。
http://firebirdfaq.sourceforge.net/faq29/

Firebird 2.0 SEQUENCE が作られ、値の取得に NEXT VALUE FOR UPDATE という構文が導入されました
http://www.firebirdsql.org/refdocs/langrefupd20-create-seq.html
http://www.firebirdsql.org/refdocs/langrefupd20-nextvaluefor.html
insert into employee (id, name) values (next value for a_seq, 'Alice')
とすると、ID 列に値がインクリメント入りますが、ID列を指定しないで値を入れたい場合は、トリガーで設定することになります。
http://symfoware.blog68.fc2.com/blog-entry-929.html
次の値を取ってくる構文がちょっと違いますが、Generator の例と同じですね
この機能は、 SQL標準で定義されているため、それに合わせるために導入されたもののようです。

Firebird 3.0 からは Identity というものが用意されました
https://github.com/FirebirdSQL/core/blob/master/doc/sql.extensions/README.identity_columns.txt

create table employee (
id integer generated by default as identity primary key,
name varchar(15)
);

と定義できるようになりました。このテーブルで

insert into employee (name) values ('Alice')

とすると id 列を指定しなくても、値がオートインクリメントで入ります。

id 列の開始値を変更するのは

alter table employee alter id restart withe 1000;

とするようです。(次に insert した時には1001 が入る)

テーブルに ID 列があることを想定している O/R マッパーが一般的になってきたので、ようやくか、という感じです。
コメント(0)  トラックバック(0) 
共通テーマ:日記・雑感

コメント 0

コメントの受付は締め切りました

Facebook コメント

トラックバック 0