依赖列的 ALTER TABLE

55

我想将一个主键的列数据类型从int改为tinyint。该列是其他表中的外键,因此我得到以下错误:


Msg 5074, Level 16, State 1, Line 1 对象 'PK_User_tbl' 取决于列 'appId'。Msg 5074, Level 16, State 1, Line 1 对象 'FK_Details_tbl_User_tbl' 取决于列 'appId'。Msg 5074, Level 16, State 1, Line 1 对象 'FK_Log_tbl_User_tbl' 取决于列 'appId'。Msg 4922,级别 16,状态 9,行 1 ALTER TABLE ALTER COLUMN appId 失败,因为有一个或多个对象访问了此列。


是否有其他方法而不必删除依赖关系并重新创建它们?

3个回答

88

我认为你需要先删除外键约束。然后更新所有相关的表,并将它们重新映射为原始状态。

ALTER TABLE [dbo.Details_tbl] DROP CONSTRAINT [FK_Details_tbl_User_tbl];
-- Perform more appropriate alters
ALTER TABLE [dbo.Details_tbl] ADD FOREIGN KEY (FK_Details_tbl_User_tbl) 
    REFERENCES User_tbl(appId);
-- Perform all appropriate alters to bring the key constraints back

然而,除非内存是一个真正的重大问题,否则我会将标识保留为整数(INT)。除非您100%确定您的键永远不会超过TINYINT约束。只是提醒一下 :)


3
在SSMS中,右键点击索引并选择“为索引创建脚本> 生成插入语句的代码> ...”会很方便。 - Marco Marsala
你太棒了!如果没有你,我今晚就睡不着了。 - dijam
右键点击表格 >> 设计,然后更新类型对我有用。 - meekash55
@meekash55 设计师想要删除整个表并重新构建,请注意如果您启用了“防止保存与表重建”,请小心。 - Poat

39

如果您的约束是针对用户类型的话,请不要忘记检查是否有一个名为DF__TableName__ColumnName__6BAEFA67的默认约束,如果有的话,则需要删除该Default Constraint,方法如下:

ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67]

更多信息请参阅才华横溢的Aaron Bertrand在这个答案中的评论。


1
仅澄清一下 - 在Visual Studio的数据上下文中,必须将DROP CONSTRAINT命令作为查询在表上执行(而不是在实际的SQL DB上的SQL MS中执行)。 (我不得不通过艰难的方式找出这个问题,因为我对这些东西很新,所以我想其他人可能会发现这种澄清有用)。 - Andy
@Andarta:非常感谢您的警告,但是在SQL Server管理工具中,“数据上下文”是什么?我遇到了这样一种情况,一个约束条件不允许我更改列,但我无法删除该约束条件,因为SQL SERVER告诉我它不存在! - realtebo
@realtebo - '数据上下文'是指在Visual Studio的服务器资源管理器中看到的数据连接上下文。因此,与其尝试在SSMS中删除约束条件,不如在Visual Studio中进行操作。 - Andy

0

你可以删除限制你的约束。如果该列具有访问其他表的权限。假设一个视图正在访问你要修改的列,那么除非你删除该视图,否则它不会允许你修改该列。并且在进行更改后,你可以重新创建该视图。

enter image description here


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接