【发布时间】: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