Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.
状況によっては、データベースに自動的にユニークな番号を生成させたいという場合があります。たとえば、商品の送り状を格納するテーブルを作成する場合、販売スタッフではなくデータベースが自動的にユニークな送り状番号を割り当てることができます。
たとえば、商品の送り状番号は、1 つ前の送り状番号に 1 を加えて作成できます。しかし、複数の人間がデータベースに送り状番号を入力するときは、この方法は使えません。2 人の従業員が同じ番号を選択する可能性があるからです。
この問題を解決するには、次に示すように方法がいくつかあります。
送り状番号を入力するユーザーごとに数字の範囲を設定する。
このスキームは、カラム user name と invoice number を持つテーブルを作成することで実装します。ローの 1 つは、送り状番号を入力するユーザーを記録するのに使います。ユーザーが送り状を追加するごとに、テーブル内の数字は 1 増えて新しい送り状に使われます。データベースのすべてのテーブルを処理するには、テーブルに 3 つのカラム (テーブル名、ユーザー名、最後のキー値) が必要です。各ユーザーに十分な数字が確保されているかどうかを定期的に確認する必要があります。
2 つのカラム table name と last key を持つテーブルを作成する。
このテーブルには、最後に使用した送り状番号が格納されるローが 1 つあります。送り状番号は、ユーザーが送り状の追加、新しい接続の確立、送り状番号の増分、または変更の即時コミットを行うたびに、自動的に増分されます。ローは別のトランザクションによって直ちに更新されるため、他のユーザーは新しい送り状番号にアクセスできます。
NEWID のデフォルト値のあるカラムを UNIQUEIDENTIFIER バイナリデータ型と組み合わせて使用して、完全にユニークな識別子を生成する。
UUID 値と GUID 値を使用すると、テーブルローをユニークに識別できます。あるコンピューターで生成された値は別のコンピューターで生成された値と一致しないため、レプリケーションと同期の環境では、UUID 値と GUID 値をキーとして使用できます。
AUTOINCREMENT のデフォルト値のカラムを使用する。次に例を示します。
CREATE TABLE Orders ( OrderID INTEGER NOT NULL DEFAULT AUTOINCREMENT, OrderDate DATE, primary key( OrderID ) );
テーブルに挿入するときに、AUTOINCREMENT カラムに対して値を指定しないと、ユニークな値が生成されます。値を指定すると、その指定した値が使われます。値がカラムの現在の最大値より大きい場合は、その後の挿入開始ポイントとしてこの値が使われます。AUTOINCREMENT カラムに最後に追加されたローの値は、グローバル変数 @@identity で取得できます。
ユニークな値を生成するためのシーケンスの使用