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に関連付けられたデータにアクセスできます。