2016-04-02 5 views
2

私は私にUNIQUEIDENTIFIERはテーブルに値を挿入するときに自動生成される番号ですか?

を伝える手順をロードすると、列にNULL値を挿入することはできませんエラーが発生している「requestID」、テーブル「MCAST.a01.tbl_enrollmentRequests」;列はNULLを許可しません。 INSERTは失敗します。

requestIDは、変数のタイプがUNIQUEIDENTIFIERです。 UNIQUEIDENTIFIERは自動生成番号ですか?以下は私のコードのサンプルで、requestIDが表示されています。ここで

CREATE PROCEDURE [a01].[usp_auditAcceptRequest] 
    (@AccountID UNIQUEIDENTIFIER, 
    @GroupID UNIQUEIDENTIFIER, 
    @Reason NVARCHAR(45) 
    ) 
AS 
BEGIN 
    SET NOCOUNT ON; 

    INSERT INTO [a01].[tbl_enrollmentRequests] (requestDate, groupID, accountID) 
    VALUES (SYSDATETIMEOFFSET(), @GroupID, @AccountID) 

    DECLARE @RequestID UNIQUEIDENTIFIER 

    SET @RequestID = (SELECT requestID 
         FROM [a01].tbl_enrollmentRequests 
         WHERE groupID = @GroupID AND accountID = @AccountID) 

    INSERT INTO [a01].[tbl_enrollmentAudits] (entryDate, requestID, groupID, accountID, accepted, reason) 
    VALUES (SYSDATETIMEOFFSET(), @RequestID, @GroupID, @AccountID, 1, @Reason) 

    DELETE FROM [a01].[tbl_enrollmentRequests] 
    WHERE requestID = @RequestID 
END; 
GO 

は、私は上記の手順

BEGIN 
DECLARE @AccountID UNIQUEIDENTIFIER; 
DECLARE @GroupID UNIQUEIDENTIFIER; 

(SELECT @AccountID = accountID 
FROM [a01].[tbl_userAccounts] WHERE accountUsername='saraht'); 

(SELECT @GroupID = groupID FROM [a01].[tbl_groups] WHERE groupName LIKE '%Foo%'); 

EXECUTE [a01].[usp_addRequest] @AccountID, @GroupID; 
END; 
GO 
あなたの助けを

感謝を実装しています場所です!

+0

'UNIQUEIDENTIFIER'は** GUID **型の列ですが、それを指定するか、テーブルの**プライマリキー**にするだけで自動的に値が追加されるわけではありません。 **(1)** **デフォルト値**の制約を指定するか、**(2)**そのテーブルのINSERT文に実際に値**を与える必要があります –

答えて

4

つまり、uniqueidentifierは通常の列です。自動的に割り当てられた値を使用する場合は、列に既定値を追加する必要があります。通常、デフォルトに使用される関数はnewid()またはnewsequentialid()です。

投稿されたテーブルの定義に基づいて編集します。言われている、あなたもUNIQUEIDENTIFIERを事前生成することができ、生成GUIDが任意に衝突しないと仮定することができるので、挿入前に、ストアドプロシージャ内の変数にそれを割り当てることを

CREATE TABLE [a01].[tbl_enrollmentRequests](
    requestID UNIQUEIDENTIFIER PRIMARY KEY DEFAULT (NEWID()), 
    requestDate DATETIMEOFFSET NOT NULL, 
    groupID UNIQUEIDENTIFIER REFERENCES [a01].[tbl_groups] (groupID) NOT NULL, 
    accountID UNIQUEIDENTIFIER REFERENCES [a01].[tbl_userAccounts] (accountID) NOT NULL 
); 

:あなたはこれを使用することができ既存のGUID。この利点は、挿入された行のIDがOUTPUT句から取得されずにわかっていることです。

パフォーマンスに関する注意:ランダムなGUIDのクラスタ化された主キー(newid()によって生成されたもの)を含むかなりの数の行は、挿入によってランダム性のために多くのページ分割が発生するため、パフォーマンスの問題です。 newsequentialid()関数は、パフォーマンスの問題をほぼ完全に解決しますが、生成されたGUIDを推測可能にするため、「ランダム」IDが不要な場合にのみ使用できます。

+0

' [A01]テーブルを作成します。[tbl_enrollmentRequests( \t requestID UNIQUEIDENTIFIER PRIMARY KEY \t、requestDate DATETIMEOFFSET NOT NULL \t、グループID UNIQUEIDENTIFIER \t \t REFERENCES [A01]。[tbl_groups](グループID) \t \t NOT NULL \t、accountIDのUNIQUEIDENTIFIER \t \t参考文献[A01] [tbl_userAccounts](のaccountID) \t \t NULL NOT); ' – BakingCake

+0

ありがとう!解決済み – BakingCake

+0

デフォルト値として 'newsequentialid()'( 'newid()'だけでなく)を使うことをお勧めします - あなたがデフォルトの制約を指定した場合 –

-2

UNIQUEIDTITIFIERは自動生成数ですか?

何をお尋ねしますか?テーブル定義を見て、新しいuniqueidentifierを設定するデフォルトが定義されているかどうかを確認します。

そうでない場合は - いいえ。

nullを挿入しようとすると、挿入しないと(挿入がデフォルト値を上書きするため)。

---編集:あなたが投稿テーブル定義を1として

requestID UNIQUEIDENTIFIER PRIMARY KEY

それを設定します定義されていないデフォルト値。そうではありません。

関連する問題