UJP - 技術情報

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

     

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>

  • 次のSQL文を実行してみる.

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>

  • INSERTした結果を確認する.

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

  • 次にデータをINSERTして確認してみる.

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が失敗したら,その時取得された番号は歯抜けとなる.



広告スペース
Google