51

我正在尝试将主键的列数据类型从 int 更改为 tinyint。此列是其他表中的外键。所以,我收到以下错误:


消息 5074,级别 16,状态 1,第 1 行对象“PK_User_tbl”依赖于列“appId”。消息 5074,级别 16,状态 1,第 1 行对象“FK_Details_tbl_User_tbl”依赖于列“appId”。消息 5074,级别 16,状态 1,第 1 行对象“FK_Log_tbl_User_tbl”依赖于列“appId”。消息 4922,级别 16,状态 9,第 1 行 ALTER TABLE ALTER COLUMN appId 失败,因为一个或多个对象访问此列。


除了删除依赖项并重新创建它们之外,还有其他方法吗?

4

3 回答 3

85

我相信您将不得不首先删除外键约束。然后更新所有适当的表并按原样重新映射它们。

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 限制。只是一个警告:)

于 2012-03-26T05:25:50.167 回答
39

如果您的约束是针对用户类型的,那么不要忘记查看是否有Default Constraint,通常类似于DF__TableName__ColumnName__6BAEFA67,如果有,则需要删除Default Constraint,如下所示:

ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67]

有关更多信息,请参阅出色的 Aaron Bertrand对此答案的评论。

于 2013-03-16T06:57:51.080 回答
0

您可以删除限制您的约束。如果该列可以访问其他表。假设一个视图正在访问您正在更改的列,那么除非您删除该视图,否则它不会让您更改该列。进行更改后,您可以重新创建视图。

在此处输入图像描述

于 2019-02-11T19:27:45.223 回答