首页 > 解决方案 > 尝试将外键添加到现有表时出现模糊错误

问题描述

我需要在我的表中添加一个新的外键,名为starList. 它目前与名为 的表没有外键关系planetList

所以我运行了这个命令:

ALTER TABLE [dbo].[starList] WITH CHECK 
    ADD CONSTRAINT [FK_starList_planetList] 
        FOREIGN KEY([planetId]) REFERENCES [dbo].[planetList] ([planetId])
                ON UPDATE CASCADE
                ON DELETE CASCADE
GO

但我得到这个错误:

ALTER TABLE 语句与 FOREIGN KEY 约束“FK_starList_planetList”冲突。
冲突发生在数据库“astro101”、表“dbo.planetList”、列“planetID”中。

我不确定那是什么意思。

我尝试在 SQL Server 上查看我的表,但没有发现任何问题。

谁能帮我弄清楚错误的含义?

谢谢!

我的starList表如下所示:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[starList]
(
    [starID] [nvarchar](50) NOT NULL,
    [galaxyID] [uniqueidentifier] NOT NULL,
    [starTitle] [nvarchar](3000) NULL,
    [planetID] [uniqueidentifier] NULL,

    CONSTRAINT [PK_StarList] 
        PRIMARY KEY CLUSTERED ([starID] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

ALTER TABLE [dbo].[starList] WITH CHECK 
    ADD CONSTRAINT [FK_starList_galaxyList] 
        FOREIGN KEY([galaxyID]) REFERENCES [dbo].[galaxyList] ([galaxyID])
                ON UPDATE CASCADE
                ON DELETE CASCADE
GO

ALTER TABLE [dbo].[starList] CHECK CONSTRAINT [FK_starList_galaxyList]
GO

planetList表格是这样的:

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[planetList]
(
    [planetID] [uniqueidentifier] NOT NULL,
    [planetText] [nvarchar](max) NULL,

    PRIMARY KEY CLUSTERED ([planetID] ASC)
                WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                      IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                      ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

标签: sqlsql-servertsqlsql-server-2008foreign-keys

解决方案


您需要检查两列中的数据。

外键表的列中有一个值,其关联值在主键表中不存在。

您在starlist.planetid 中有与planetlist.planetid 不匹配/对应的数据。

它们都需要与 values 值相同。最好将它们截断,然后尝试创建约束。

简而言之,违反了参照完整性规则。

如果是这种情况,请记住在填充表之前创建外键。


推荐阅读