sql-server - SQL Server 2005 中的不可见外键

标签 sql-server

我有一个脚本,通过检查外键是否存在来更新数据库,如果不存在,则创建它。它是由 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 实例上重现了该问题。所以版本似乎并不太重要。

知道什么可能导致这种情况吗?

最佳答案

它提示您尝试添加的 FK 约束,因为表中存在现有数据,如果成功应用约束,这些数据将不再有效。

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

关于sql-server - SQL Server 2005 中的不可见外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12624345/

相关文章:

SQL 选择 : Get the previous Date in column

sql - 需要在sql中获取上个月只有3个字母JUL

asp.net - Azure API应用程序与移动应用程序与Web应用程序

c# - 如何将变量(别名)传递给where条件SQL

sql - T-SQL 跳过获取存储过程

mysql - 如何根据另一个表中的 %LIKE% 值过滤一个表

带参数的 SQL 插入适用于 MSAccess,但不适用于 SQL Server

java - 如何使用java启用SQL服务器连接

Python:每n秒轮询一次SQL数据库并根据它执行任务

sql服务器回滚