2

我有一个脚本来通过检查外键的存在来更新数据库,如果它不存在,则创建它。它是由 SQL Management Studio 生成的。

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'.

这是非常神秘的。就查询而言,没有外键的踪迹,但创建脚本失败并出现上述错误。服务器正在运行 SQL Server 2005 SP3 (9.00.4035.00)。

[更新]:我刚刚在 SQL Server 2012 实例上重现了该问题。所以版本似乎不太重要。

知道是什么原因造成的吗?

4

2 回答 2

4

它抱怨您尝试添加的 FK 约束,因为如果成功应用约束,表中的现有数据将不再有效。

可能意味着有一个或多个 ChangeRequestForecast 记录,其中 CostingCenterID 的值与 CostingCenter.CostingCenterID 不对应。

于 2012-09-27T15:45:52.940 回答
1

打开 SSMS,转到该数据库,展开该表,然后查看“约束”部分。那里可能有一个名为“FK_tblChangeRequestForecast_tblCostingCenter”的内容,您需要确定是否需要,如果不需要,请将其删除。

于 2012-09-27T15:24:20.370 回答