Sql 无法在表中的可空列上定义主键约束
我最终创建了一个表Sql 无法在表中的可空列上定义主键约束,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我最终创建了一个表employee,其中包含一列empid,该列是一个计算列,该列也是主键 它是一个自引用表,列managerid引用回自身 但是现在,当我在添加更多列后保存表时,我得到了一个错误 “注册”表 无法创建索引“PK\U注册”。 无法在表“注册”中的可空列上定义主键约束。 无法创建约束。请参阅前面的错误 但是我的桌子工作得很好 我希望以图形方式在表中工作,而不是每次进行更改时都进行编码 我不能用图形的方式来做这件事,因为这个错误有100个表格,我不喜欢这样做,编码很烦人 我想在SQL
employee
,其中包含一列empid
,该列是一个计算列,该列也是主键
它是一个自引用表,列managerid
引用回自身
但是现在,当我在添加更多列后保存表时,我得到了一个错误
“注册”表无法创建索引“PK\U注册”。
无法在表“注册”中的可空列上定义主键约束。
无法创建约束。请参阅前面的错误 但是我的桌子工作得很好 我希望以图形方式在表中工作,而不是每次进行更改时都进行编码 我不能用图形的方式来做这件事,因为这个错误有100个表格,我不喜欢这样做,编码很烦人 我想在SQLServer2008ManagementStudio中以图形方式进行此操作,是否可能 这是我的桌子
CREATE TABLE [dbo].[Registration](
[empid] AS ('Sale_'+CONVERT([varchar](50),[id],(0))) PERSISTED NOT NULL,
[id] [int] IDENTITY(900000,1) NOT NULL,
[First_Name] [varchar](40) NULL,
[Last_Name] [varchar](40) NULL,
[Address] [varchar](40) NULL,
[E_Mail] [varchar](40) NULL,
[Country] [varchar](40) NULL,
[Mobile_No] [varchar](40) NULL,
[Designation] [varchar](40) NULL,
[managerID] [varchar](55) NULL,
CONSTRAINT [PK_Registration] PRIMARY KEY CLUSTERED
(
[empid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
ALTER TABLE [dbo].[Registration] WITH CHECK ADD CONSTRAINT [FK_Registration_Registration] FOREIGN KEY([managerID])
REFERENCES [dbo].[Registration] ([empid])
GO
ALTER TABLE [dbo].[Registration] CHECK CONSTRAINT [FK_Registration_Registration]
GO
您不能将empid用作主键。
使用id作为主键。
使用“[int]IDENTITY”作为表的主键是执行主键的最常用方法。 主键和聚集索引将控制存储。
我看不出使用empid作为主键有什么好处。
只需将empid设置为计算列。对于查询,SQLServer将看到它是计算列,并且只使用主键。SQL server将在其查询中仅使用主键。无法真正重现您的问题,我可以毫无问题地运行您的脚本(如您所说),然后尝试在SQL Management Studio中添加另一列(通过单击“不按脚本”),但我没有收到您提到的错误,也许你还有一些没有写过的步骤?感谢你在sql中回复designer中的open table,编辑数据类型长度为40到41的手机号码,并查看我所做的错误。我在designer中打开了表并添加了一个新列。我可以查询它,没有错误。在执行您的脚本后,您的具体步骤是什么?使用desginer是一个可怕的想法(它会删除并重新创建表,当您进行更改并且表中有数据时,这是一个真正的性能问题)。所有数据库代码都是代码,应该编写脚本并放入源代码管理。如果您不喜欢编写sql,那就太糟糕了。