【问题标题】:Sql Server 2008 Create Foreign Key ManuallySql Server 2008 手动创建外键
【发布时间】:2012-10-26 17:54:39
【问题描述】:

我继承了一个设计不佳的旧数据库。它是一个 Sql Server 2008 数据库,缺少很多外键关系。下面显示了两个表,我正在尝试在 dbo.app_status.status_iddbo.app_additional_info.application_id

之间手动创建 FK 关系

我在尝试使用下面的查询创建关系时使用 SQL Server Management Studio

USE myDatabase; 
GO ALTER TABLE dbo.app_additional_info 
ADD CONSTRAINT FK_AddInfo_AppStatus FOREIGN KEY (application_id) 
    REFERENCES dbo.app_status (status_id) 
    ON DELETE CASCADE
    ON UPDATE CASCADE ; 
GO

但是,我在运行查询时收到此错误

ALTER TABLE 语句与 FOREIGN KEY 约束冲突 “FK_AddInfo_AppStatus”。数据库发生冲突 “myDatabase”,表“dbo.app_status”,列“status_id”。

我想知道查询是否因为每个表已经包含大约 130,000 条记录而失败?

请帮忙。

谢谢。

【问题讨论】:

  • 我看到已经有外键了,你能先把现有的 fk 去掉吗?
  • @Larry 我正在尝试将 fk 添加到 dbo.app_additional_info 表中
  • 与 FOREIGN KEY 约束“FK_AddInfo_AppStatus”冲突,而您尝试创建的 FK 名称为“FK_AddInfo_AppStatus”,是不是因为这个?
  • 我大胆猜测问题出在数据上。子表中可能有一些记录在父表中没有匹配的 ID。尝试运行:SELECT application_id FROM app_additional_info WHERE application_id NOT IN (SELECT status_id FROM app_status);
  • @SchmitzIT 谢谢。很有帮助。

标签: sql sql-server sql-server-2008 foreign-keys


【解决方案1】:

发生错误是因为dbo.app_additional_info.application_ID 中有一个不在dbo.app_Status.Status_ID 中的值。除非命名约定严重混乱,否则您会尝试向不相关的列添加关系,为什么application_ID 会引用status_ID

我希望dbo.App_Additional_Info.Application_ID 应该引用dbo.Application.Application_ID(稍微猜测表名和列名)所以你会想要这个:

USE MyDatabase
GO
ALTER TABLE dbo.App_Additional_Info
ADD CONSTRAINT FK_App_Additional_Info_Application_ID (Application_ID)
    REFERENCES dbo.Application (Application_ID)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

【讨论】:

  • 谢谢,这正是问题所在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-25
  • 1970-01-01
  • 2013-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多