SQL Serverでは、NEWSEQUENTIALID()
を使用できます。 増分一意値を作成する関数。
オペレーティングシステムの起動以降、指定されたコンピューターでこの関数によって以前に生成されたGUIDよりも大きいGUID(グローバル一意識別子)を作成します。オペレーティングシステムを再起動した後、GUIDはより低い範囲から再開できますが、それでもグローバルに一意です。
NEWSEQUENTIALID()
関数はDEFAULT
でのみ使用できます タイプuniqueidentifierのテーブル列に対する制約 。したがって、SELECT NEWSEQUENTIALID()
のようなクエリを実行することはできません。 そしてそれが機能することを期待します(しかしあなたはできます NEWID()
でそれを行います 関数)。
例1-デフォルト値として
これがどのように機能するかを示す簡単な例です:
USE Test; CREATE TABLE Prisoner ( PrisonerId uniqueidentifier NOT NULL DEFAULT NEWSEQUENTIALID(), PrisonerName varchar(70) NOT NULL, ); INSERT Prisoner (PrisonerName) VALUES ('Jerry Seinfeld'), ('George Costanza'), ('Elaine Benes'); SELECT * FROM Prisoner;
結果:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | +--------------------------------------+-----------------+
GUIDはDEFAULT
の一部として生成されたことに注意してください テーブルの制約。 INSERT
では明示的に提供されていません ステートメント。
例2–INSERTステートメントで明示的に提供される
NEWSEQUENTIALID()
を使用しようとするとどうなりますか INSERT
で ステートメント:
INSERT Prisoner (PrisonerId, PrisonerName) VALUES (NEWSEQUENTIALID(), 'Kramer');
結果:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
したがって、DEFAULT
の一部である必要があります 制約(前の例のように)。
上記のデータを挿入するには、INSERT
から最初の列を削除するだけです。 操作:
INSERT Prisoner (PrisonerName) VALUES ('Kramer'); SELECT * FROM Prisoner;
結果:
+--------------------------------------+-----------------+ | PrisonerId | PrisonerName | |--------------------------------------+-----------------| | a46d433e-f36b-1410-8a80-007d2b533547 | Jerry Seinfeld | | aa6d433e-f36b-1410-8a80-007d2b533547 | George Costanza | | b06d433e-f36b-1410-8a80-007d2b533547 | Elaine Benes | | b76d433e-f36b-1410-8a80-007d2b533547 | Kramer | +--------------------------------------+-----------------+
例3–SELECTステートメントで使用
この関数を基本的なSELECT
で使用しようとすると、同じエラーが発生します このようなステートメント:
SELECT NEWSEQUENTIALID();
結果:
Msg 302, Level 16, State 0, Line 1 The newsequentialid() built-in function can only be used in a DEFAULT expression for a column of type 'uniqueidentifier' in a CREATE TABLE or ALTER TABLE statement. It cannot be combined with other operators to form a complex scalar expression.
セキュリティ/プライバシー
NEWSEQUENTIALID()
は使用しないことをお勧めします 機密データの場合、次に生成されたGUIDの値を推測できるため、そのGUIDに関連付けられたデータにアクセスできます。