尝试将外键添加到现有表时出现模糊错误

时间:2020-09-02 15:02:35

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

我需要向表中添加一个名为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

1 个答案:

答案 0 :(得分:2)

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

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

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

两个值都必须与value值相同。最好截断它们,然后尝试创建约束。

简而言之,存在违反参照完整性规则的情况。

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