Mil*_*lee 46 alter-table sql-server-2008 alter-column
我试图将主键的列数据类型从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失败,因为一个或多个对象访问此列.
除了删除依赖项并重新创建它们之外还有其他方法吗?
Jus*_*ony 78
我相信你必须首先删除外键约束.然后更新所有相应的表并按原样重新映射它们.
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
Run Code Online (Sandbox Code Playgroud)
但是,除非内存是一个非常大的问题,否则我会将身份保持为INT.除非你100%肯定你的钥匙永远不会超过TINYINT限制.只是提醒一句:)
Ser*_*gan 37
如果您的约束是在用户类型上,那么不要忘记查看是否存在Default Constraint
,通常是类似的DF__TableName__ColumnName__6BAEFA67
,如果是,那么您将需要删除Default Constraint
,如下所示:
ALTER TABLE TableName DROP CONSTRAINT [DF__TableName__ColumnName__6BAEFA67]
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅杰出的Aaron Bertrand 对此答案的评论.