依赖列上的ALTER TABLE

时间:2012-03-26 05:23:22

标签: sql-server-2008 alter-table alter-column

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


  

Msg 5074,Level 16,State 1,Line 1对象'PK_User_tbl'是   依赖于列'appId'。 Msg 5074,Level 16,State 1,Line 1 The   对象'FK_Details_tbl_User_tbl'依赖于列'appId'。消息   5074,等级16,状态1,行1对象'FK_Log_tbl_User_tbl'是   依赖于列'appId'。 Msg 4922,Level 16,State 9,Line 1 ALTER   TABLE ALTER COLUMN appId失败,因为一个或多个对象访问   这一栏。


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

3 个答案:

答案 0 :(得分:75)

我相信您必须首先删除外键约束。然后更新所有相应的表并按原样重新映射它们。

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限制。请注意:)

答案 1 :(得分:37)

如果您的约束是针对用户类型的,那么不要忘记查看是否有Default Constraint,通常是DF__TableName__ColumnName__6BAEFA67,如果是,那么您需要删除{{1像这样:

Default Constraint

有关更多信息,请参阅辉煌的Aaron Bertrand对this answer的评论。

答案 2 :(得分:0)

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

enter image description here

相关问题