2016-04-02 26 views
2

我加載過程告訴我,當有一個錯誤在表中插入值時,UNIQUEIDENTIFIER是否爲自動生成的數字?

無法將NULL值插入列「請求ID」,表「MCAST.a01.tbl_enrollmentRequests」;列不允許有空值。 INSERT失敗。

現在requestIDUNIQUEIDENTIFIER類型的變量。 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()

根據發佈的表格定義進行編輯;可以使用此:

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可以假定不與任何碰撞現有的GUID。這樣做的好處是,即使不從OUTPUT子句中檢索它,也知道插入行的標識。

關於性能的通知:隨機GUID集羣主鍵的大量行(由newid()生成)是一個性能問題,因爲插入將導致由於隨機性而發生許多頁面拆分。 newsequentialid()函數幾乎完全解決了性能問題,但它使得生成的GUID可以猜測,因此只有在不需要「隨機」ID時才能使用它。

+0

' CREATE TABLE [A01]。[tbl_enrollmentRequests]( \t的requestId UNIQUEIDENTIFIER PRIMARY KEY \t,requestDate DATETIMEOFFSET NOT NULL \t,組ID UNIQUEIDENTIFIER \t \t參考文獻[A01]。[tbl_groups](組ID) \t \t NOT NULL \t,帳戶ID UNIQUEIDENTIFIER \t \t參考文獻[A01] [tbl_userAccounts](帳戶) \t \t NOT NULL );' – BakingCake

+0

謝謝!解決 – BakingCake

+0

我會推薦使用'newsequentialid()'(不只是'newid()')作爲默認值 - 如果您指定一個默認約束 –

-2

UNIQUEIDENTIFIER是否爲自動生成的號碼?

你問我們什麼?您可以查看錶定義並查看是否定義了設置新uniqueidentifier的默認值。

如果它不是 - 那麼沒有。

如果您試圖插入null,那麼也不會(因爲您的插入覆蓋了默認值)。

---編輯:

按照您發佈的表定義:

的requestId UNIQUEIDENTIFIER PRIMARY KEY

沒有定義默認值設置它。所以不行。

相關問題