【问题标题】:Vague error when trying to add a foreign key to an existing table尝试将外键添加到现有表时出现模糊错误
【发布时间】:2020-12-21 18:51:22
【问题描述】:

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

【问题讨论】:

  • 在我看来,这个错误并不是特别模糊。它告诉您至少一个现有行会导致外键约束失败,因此无法创建。
  • 如果你运行SELECT sl.planetId FROM dbo.starList sl LEFT JOIN dbo.planetlist pl ON sl.planetId = pl.planetId WHERE pl.planetId IS NULL;,你会得到CONSTRAINT失败的行。
  • 附带说明,一年多来,SQL Server 2008 完全不受支持,您应该尽快查看升级路径。
  • @Larnu 哦,哇,有道理!我从来不知道。我运行该查询并在我的 starList 表中发现了一堆在 planetList 表中不存在的 planetID 值。我将删除并重新运行。你认为 NULL 值重要吗?因为starList中的planetId列默认为NULL。
  • NULL 值被忽略外键约束,@SkyeBoniwell。

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


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 谢谢你让我看看
  • 你可以简单地更新:update tbl set col=null;或删除并阅读该列;更改表删除列 x;更改表添加列 x ;
  • 哦,好吧,就像:UPDATE starList SET planetID = NULL WHERE planetID NOT IN...
  • 截断整列,然后添加约束。所以没有 where 条件。
猜你喜欢
  • 2013-11-16
  • 2011-06-01
  • 1970-01-01
  • 2023-03-06
  • 2013-10-18
  • 1970-01-01
  • 2016-03-03
  • 1970-01-01
  • 2014-11-21
相关资源
最近更新 更多