我有一个名为Cases
的表,其中包含有关IV_Date
,IV_Length
,Interviewer
等访谈的信息。我还在{{1}内有一个字段} Cases
(一个Case_Code
),它是一个六个字符(三个字母+三个数字)的标识符;例如“ABC123”或“ZZZ999”。 varchar
(ContactID
)上有一个外键,指向int
表。我创建了一个计算列,它是这个Contact
表的PRIMARY KEY,名为Cases
。 CaseID
只是CaseID
和Case_Code
的串联。因此,对案例“ZZZ999”进行处理的ContactID
“25”被赋予ContactID
“ZZZ99925”。 CaseID
和Case_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.'
答案 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_Code
,ContactID
}上会更简单。然后你可以停止持久化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。在设计器中,选择两列,右键单击并从菜单中选择“设置原始键”。