IDENTITYをつこてみる 〜Sybaseで自動連番機能を使う〜
IDENTITYをつこてみる
〜Sybaseで自動連番機能を使う〜
0.改訂履歴
- 2002.08.13 新規作成
- 2002.08.14 誤差についてのいドキュメントを作ったのでリンクをつけた.
1.はじめに
このドキュメントでは,Sybase ASEで,フィールド属性のIDENTITYを使ってみる.
IDENTITYとは,身も蓋もない言い方をすると,OracleのSEQUENCEと同等のもの.
2.identity属性の機能を確認する
1> create table TEST_TABLE
2> (
3> aaa numeric(10,0) identity,
4> bbb char(10)
5> )
6> go
1>
|
1> insert into TEST_TABLE values("aa")
2> go
(1 row affected)
1> insert into TEST_TABLE values("bb")
2> go
(1 row affected)
1>
|
1> select * from TEST_TABLE
2> go
aaa bbb
------------- ----------
1 aa
2 bb
(2 rows affected)
1>
|
- identity属性を設定した項目aaaに,自動的に連番が設定されている事が確認できる.
3.Identity属性を持つフィールドに任意の数値を入力する.
- 次のsetコマンドを入力する事によって,セッション内で自動連番されないようになる.
- そのためにはidentity_insertを設定する.
1> set identity_insert TEST_TABLE on
2> go
|
1> insert into TEST_TABLE (aaa,bbb) values(99,"cc")
2> go
(1 row affected)
1> select * from TEST_TABLE
2> go
aaa bbb
------------- ----------
1 aa
2 bb
99 cc
(3 rows affected)
1>
|
- 99なんて数値が入った.
- この時,INSERT文ではフィールド名を省略して実行すると,エラーになる.
- たとえばinsesrt into TEST_TABLE values("cc")だとエラー.
- identity_insertを戻して,INSERTをしてみる.
1> set identity_insert TEST_TABLE off
2> go
1> insert into TEST_TABLE values("dd")
2> go
(1 row affected)
1> select * from TEST_TABLE
2> go
aaa bbb
------------- ----------
1 aa
2 bb
99 cc
100 dd
(4 rows affected)
1>
|
4.IDENTITYの連番についての注意点
- IDENTITYの値は,メモリ内で取得される.
- よって,Sybase(ASE)が異常終了すると,必ずしも連番にならないことがある.
- どこかのドキュメントに,500000番程度空白ができる可能性があるとか書いてあった.
- そのため,IDENTITYを使うフィールドは,余裕を持った桁数としておく.
- よくあるのが,Windows版のSybase(ASE)が稼働している状態で,OSをリブートするなどした場合に思わず歯抜けになる事がある.
- 一度取得された数値は再利用されない.
- たとえば,複数のトランザクションが同時に動作していて,INSERTが失敗したら,その時取得された番号は歯抜けとなる.