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

时间:2014-04-02 15:08:03

标签: sql sql-server database

我有一个名为Cases的表,其中包含有关IV_DateIV_LengthInterviewer等访谈的信息。我还在{{1}内有一个字段} Cases(一个Case_Code),它是一个六个字符(三个字母+三个数字)的标识符;例如“ABC123”或“ZZZ999”。 varcharContactID)上有一个外键,指向int表。我创建了一个计算列,它是这个Contact表的PRIMARY KEY,名为CasesCaseID只是CaseIDCase_Code的串联。因此,对案例“ZZZ999”进行处理的ContactID“25”被赋予ContactID“ZZZ99925”。 CaseIDCase_Code都不接受空值,因此ContactID显然不会。设置CaseID时,我将其创建为NOT NULL,PRIMARY KEY,并使用公式“[Case_Code] + CONVERT([varchar],[contactID],0)”。我认为一切正常,但是当我尝试重新排列SQL Studio表设计视图中的任何字段时,我会抛出此错误:

CaseID

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

使用代码编辑:

'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.'

5 个答案:

答案 0 :(得分:2)

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

首先,我们必须删除空约束并对列应用NOT NULL约束。为此,请执行以下查询

ALTER TABLE tbl_name alter column column_name int NOT NULL

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

ALTER TABLE tbl_name ADD PRIMARY KEY (column_name)

我希望这会对你有所帮助

答案 1 :(得分:1)

我也碰到了这个。您可以在计算字段上创建PK,只要它标记为NOT NULL,但SQL Server表设计界面不处理这种情况;它似乎在修改表时将所有计算字段标记为NULLable。

首先,我强烈建议您始终使用脚本而不是GUI创建和修改表。这样做可以记录您拥有的内容以及您所做的更改;您可以运行它们以在任何时间点重新创建数据库。正如HLGEM所提到的,您还可以将这些脚本保存在源代码管理中。使用这些脚本可以更轻松地完成GUI难以处理的事情,正如您在此处发现的那样,它们可以在GUI中执行不可能完成的任务。

在表设计器中,删除您的PK。然后,您应该能够保存表格,从而影响您想要实现的字段的重新排序。接下来,您需要删除并重新创建计算字段,最后您可以重新创建PK。 E.g:

ALTER TABLE Cases DROP COLUMN CaseID
ALTER TABLE Cases ADD CaseID AS (Case_Code + CAST(ContactID AS CHAR(6))) PERSISTED NOT NULL
ALTER TABLE Cases ADD CONSTRAINT CPK_Cases PRIMARY KEY CLUSTERED (CaseID)

如果您有任何引用计算字段的索引(我们已经删除的PK除外),您需要删除它们才能删除计算字段。当然,请务必重新创建它们。

最后,虽然Dean不支持他的断言,计算字段对PK不好,但他认为将PK放在{Case_CodeContactID}上会更简单。然后你可以停止持久化CaseID(如果你甚至需要它)并节省一点磁盘空间。

答案 2 :(得分:0)

使用此查询

Alter table tablename
add column datatype identity(1,1)

答案 3 :(得分:0)

这似乎是SQL Server Management Studio中的错误。最简单的方法是使用设计器进行更改。然后使用以下命令生成更改脚本:

Right-click > Generate Change Script...

复制生成的SQL或将其保存到文件中。然后,在CREATE TABLE语句的计算列中添加“ NOT NULL”并运行SQL文件

答案 4 :(得分:-1)

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