当列已为NOT NULL时,无法在可为空的列上定义PRIMARY KEY约束

Ste*_*tes 5 sql database sql-server

我有一个表称为Cases具有约访谈如信息IV_DateIV_LengthInterviewer等我也有内的字段Cases被称为Case_Code(A varchar),它是一个六字符(三个字母+三个数字)标识符; 例如“ ABC123”或“ ZZZ999”。ContactID(an int)上有一个外键,它指向一个Contact表。我创建了一个计算列,它是此Cases表的PRIMARY KEY ,称为CaseIDCaseID仅仅是的串联Case_CodeContactID。因此,ContactID为案例“ ZZZ99925”工作的“ 25”被指定CaseID为“ ZZZ99925”。既不Case_Code也不ContactID接受null,因此CaseID显然不接受。设置时CaseID我将其创建为NOT NULL,PRIMARY KEY,并使用了公式“ [Case_Code] + CONVERT([varchar],[contactID],0)”。我以为一切都很好,但是当我尝试重新排列SQL Studio表设计视图中的任何字段时,会抛出此错误:

'Cases (dbo)' table
- Unable to create index 'PK_Cases_1'.  
Cannot define PRIMARY KEY constraint on nullable column in table 'Cases'.
Could not create constraint. See previous errors.'
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会收到此错误,因为表中的所有NOT NULL列都包含数据。任何帮助或想法将不胜感激。谢谢!

使用代码进行编辑:

CREATE TABLE [dbo].[Cases](
    [ContactID] [int] NOT NULL,
    [Case_Code] [varchar](16) NOT NULL,
    [Assigned_To] [varchar](100) NULL,
    [LEK_Interviewer] [varchar](255) NULL,
    [Case_Notes] [varchar](max) NULL,
    [IV_Status] [varchar](100) NULL,
    [IV_Quality] [numeric](18, 0) NULL,
    [IV_Date] [date] NULL,
    [IV_Length] [varchar](50) NULL,
    [Address] [varchar](100) NULL,
    [City] [varchar](100) NULL,
    [State] [varchar](50) NULL,
    [Zip] [varchar](25) NULL,
    [Country] [varchar](50) NULL,
    [Total_Honorarium] [money] NULL,
    [Currency] [varchar](20) NULL,
    [Last_Update] [varchar](50) NULL,
    [CaseID]  AS ([Case_Code]+CONVERT([varchar],[contactID],0)) PERSISTED NOT NULL,
    CONSTRAINT [PK_Cases_1] PRIMARY KEY CLUSTERED 
    (
        [CaseID] ASC
    )WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF,        ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
    ) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

小智 6

主键不能应用于具有空约束(可空)的列。创建表时,默认情况下,每列都是可为空的。

因此,首先,我们必须删除null约束并在该列上应用NOT NULL约束。为此,执行以下查询

ALTER TABLE tbl_name alter column column_name int NOT NULL
Run Code Online (Sandbox Code Playgroud)

之后,您可以在同一列上应用主键。为此,执行以下查询

ALTER TABLE tbl_name ADD PRIMARY KEY (column_name)
Run Code Online (Sandbox Code Playgroud)

我希望这能帮到您


dea*_*ean -1

不要使用计算列作为主键,这是非常糟糕的主意。在您的情况下,只需在 CaseCode 和 ContactID 列上定义 PK 即可。在设计器中,选择两列,右键单击并从菜单中选择“设置主键”。