sql >> データベース >  >> RDS >> Sqlserver

NEWSEQUENTIALID()を使用して、SQLServerでインクリメントGUIDを作成します

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


    1. SQLServerでのCASE式の使用

    2. Postgresデータ型NUMERICは符号付きの値を保存できますか?

    3. RUNAS / NETONLY機能を(C#/。NET / WinForms)プログラムに組み込む方法は?

    4. getReadableDatabase()を呼び出すときのNullポインタ例外