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 は、1 つ以上のオブジェクトがこの列にアクセスしているため、失敗しました。


依存関係を削除して再作成する以外に方法はありますか?

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

ただし、メモリが非常に大きな問題でない限り、ID は INT のままにします。キーが TINYINT の制約を超えて成長することは決してないと 100% 確信している場合を除きます。注意の一言:)

于 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 に答える