2

外部キーの存在を確認し、存在しない場合は作成してデータベースを更新するスクリプトがあります。これは、SQLManagementStudioによって生成されました。

IF NOT EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tblChangeRequestForecast_tblCostingCenter]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblChangeRequestForecast]'))
ALTER TABLE [dbo].[tblChangeRequestForecast]  WITH CHECK ADD  CONSTRAINT [FK_tblChangeRequestForecast_tblCostingCenter] FOREIGN KEY([CostingCenterID])
REFERENCES [dbo].[tblCostingCenter] ([CostingCenterID])
GO

IF  EXISTS (SELECT * FROM sys.foreign_keys WHERE object_id = OBJECT_ID(N'[dbo].[FK_tblChangeRequestForecast_tblCostingCenter]') AND parent_object_id = OBJECT_ID(N'[dbo].[tblChangeRequestForecast]'))
ALTER TABLE [dbo].[tblChangeRequestForecast] CHECK CONSTRAINT [FK_tblChangeRequestForecast_tblCostingCenter]
GO

スクリプトを実行すると、エラーが発生します。

The ALTER TABLE statement conflicted with the FOREIGN KEY constraint "FK_tblChangeRequestForecast_tblCostingCenter". The conflict occurred in database "mydatabase", table "dbo.tblCostingCenter", column 'CostingCenterID'.

これはとても不思議です。クエリが知る限り、外部キーの痕跡はありませんが、作成スクリプトは上記のエラーで失敗します。サーバーはSQLServer2005 SP3(9.00.4035.00)を実行しています。

[更新]:SQLServer2012インスタンスで問題を再現しました。したがって、バージョンはそれほど重要ではないようです。

これを引き起こす可能性のあるアイデアはありますか?

4

2 に答える 2

4

制約が正常に適用された場合に無効になる既存のデータがテーブルにあるため、追加しようとしているFK制約について不平を言っています。

おそらく、CostingCenterIDの値がCostingCenter.CostingCenterIDと一致しない1つ以上のChangeRequestForecastレコードがあることを意味します。

于 2012-09-27T15:45:52.940 に答える
1

SSMSを開き、そのデータベースに移動し、そのテーブルを展開して、[制約]セクションを確認します。「FK_tblChangeRequestForecast_tblCostingCenter」と呼ばれるものがあり、必要かどうかを判断し、必要でない場合は削除する必要があります。

于 2012-09-27T15:24:20.370 に答える