Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データベースの作成 » トランザクションと独立性レベルの使用

 

プライマリ・キーの生成と同時実行性

状況によっては、データベースに自動的にユニークな番号を生成させたいという場合があります。たとえば、商品の送り状を格納するテーブルを作成する場合、販売スタッフではなくデータベースが自動的にユニークな送り状番号を割り当てることができます。

たとえば、商品の送り状番号は、1 つ前の送り状番号に 1 を加えて作成できます。しかし、複数の人間がデータベースに送り状番号を入力するときは、この方法は使えません。2 人の従業員が同じ番号を選択する可能性があるからです。

この問題を解決するには、次に示すように方法がいくつかあります。

  • 送り状番号を入力するユーザごとに数字の範囲を設定する。

    このスキームは、カラム user name と invoice number を持つテーブルを作成することで実装します。ローの 1 つは、送り状番号を入力するユーザを記録するのに使います。ユーザが送り状を追加するごとに、テーブル内の数字は 1 増えて新しい送り状に使われます。データベースのすべてのテーブルを処理するには、テーブルに 3 つのカラム (テーブル名、ユーザ名、最後のキー値) が必要です。各ユーザに十分な数字が確保されているかどうかを定期的に確認する必要があります。

  • 2 つのカラム table name と last key を持つテーブルを作成する。

    このテーブルには、最後に使った送り状番号を入れるローが 1 つあります。新しく送り状を作成するには、データベースに接続し、テーブルの数字を 1 増やし、コミットします。1 増加した数字は新しい送り状に使います。他のユーザも送り状番号を取得できます。瞬時に終わる別のトランザクションで、送り状番号のローが更新されたからです。

  • NEWID のデフォルト値のあるカラムを UNIQUEIDENTIFIER バイナリ・データ型と組み合わせて使用して、完全にユニークな識別子を生成する。

    UUID 値と GUID 値を使用してテーブル内のユニークなローを識別できます。この値は、1 台のコンピュータで生成された値が、他のコンピュータで生成された値と一致しないように生成されます。したがって、これらの値は、レプリケーション環境と同期環境でキーとして使用できます。

    ユニークな識別子の生成の詳細については、NEWID デフォルトを参照してください。

  • AUTOINCREMENT のデフォルト値のカラムを使用する。次に例を示します。

    CREATE TABLE Orders (
       OrderID INTEGER NOT NULL DEFAULT AUTOINCREMENT,
       OrderDate DATE,
       primary key( OrderID )
    );

    テーブルに挿入するときに、オートインクリメント・カラムに対して値を指定しないと、ユニークな値が生成されます。値を指定すると、その指定した値が使われます。値がカラムの現在の最大値より大きい場合は、その後の挿入開始ポイントとしてこの値が使われます。オートインクリメント・カラムに最後に追加されたローの値は、グローバル変数 @@identity で取得できます。