【发布时间】:2017-08-30 14:55:07
【问题描述】:
我有一个表,当我从 SQL Server Management Studio 创建定义时,我得到了这个
CREATE TABLE [dbo].[Settings]
(
[SettingsID] [int] NOT NULL,
[Contact1] [uniqueidentifier] NULL,
CONSTRAINT [PK_Settings]
PRIMARY KEY CLUSTERED ([SettingsID] ASC)
) ON [PRIMARY]
GO
ALTER TABLE [dbo].[Settings] WITH CHECK
ADD FOREIGN KEY([Contact1])
REFERENCES [dbo].[User] ([UserSID])
GO
我正在尝试删除 Contact1 列并删除外键
当我尝试直接删除该列时,我得到了这个
ALTER TABLE Settings
DROP COLUMN Contact1
错误:
对象“FK__GlobalSet_72E607DB”依赖于列“Contact1”。
消息 4922,第 16 级,状态 9,第 24 行
ALTER TABLE DROP COLUMN Contact1 失败,因为一个或多个对象访问此列。
当我尝试先删除外键时
ALTER TABLE Settings
DROP CONSTRAINT Contact1
错误:
消息 3728,第 16 层,状态 1,第 24 行
“Contact1”不是约束。
消息 3727,第 16 级,状态 0,第 24 行
无法删除约束。查看以前的错误。
谁能告诉我如何删除现有表中的外键列。
谢谢
【问题讨论】:
-
FK__GlobalSet_72E607DB是约束的名称,而不是Contact1 -
是的,我注意到了,但不确定它是如何生成的。这是否总是相同的名称。
-
stackoverflow.com/questions/45945900/… 发现这个可以解决问题,但仍然不确定该名称是如何生成的。
-
自动,由 SQL Server,因为您在生成外键时没有命名约束。
ALTER TABLE Settings ADD CONSTRAINT FK_Settings_Contact1_User_UserSID FOREIGN KEY(Contact1) REFERENCES [User](UserSID)将是完整的形式。是的,这样做是一个真的好主意,因为必须在运行时获取名称是一件很痛苦的事情。 -
没有。 constraint 没有名字,column 有。 (一列可以有多个外键约束,所以不能有像
Contact1这样的简单名称。)that 语句的显式形式是ALTER TABLE Settings ADD Contact1 UNIQUEIDENTIFIER, CONSTRAINT FK_Settings_Contact1_User_UserSID FOREIGN KEY(Contact1) REFERENCES dbo.[User](UserSID)。
标签: sql sql-server sql-server-2008