我正在尝试将主键的列数据类型从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失败,因为一个或多个对象访问 这一栏。
除了删除依赖项并重新创建它们之外还有其他方法吗?
答案 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)