在表中插入值时,UNIQUEIDENTIFIER是自动生成的数字吗?

时间:2016-04-02 16:51:58

标签: sql-server

加载程序告诉我

时出错
  

无法将值NULL插入列'requestID',表'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

感谢您的帮助!!

2 个答案:

答案 0 :(得分:7)

话虽这么说,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
);

话虽如此,您还可以预先生成uniqueidentifier并在插入之前将其分配给存储过程中的变量,因为可以假定生成的GUID不会与任何现有GUID冲突。这样做的好处是,即使没有从OUTPUT子句中检索它,您也知道插入行的ID。

关于性能的通知:具有随机GUID的聚簇主键(由newid()生成)的大量行是性能问题,因为插入将导致由于随机性而发生许多页面拆分。 newsequentialid()函数几乎完全解决了性能问题,但它使生成的GUID可以猜测,因此只能在" random"不需要ID。

答案 1 :(得分:-3)

  

UNIQUEIDENTIFIER是否是自动生成的数字?

你问我们什么?您可以查看表定义,看看是否定义了设置新uniqueidentifier的默认值。

如果不是 - 那么没有。

如果您尝试插入null,则也不会(因为您的插入会覆盖默认值)。

---编辑:

根据您发布的表格定义:

  

requestID UNIQUEIDENTIFIER PRIMARY KEY

没有定义设置它的默认值。所以没有。