Sql 尝试将外键添加到现有表时出现模糊错误
我需要在我的表中添加一个名为Sql 尝试将外键添加到现有表时出现模糊错误,sql,sql-server,tsql,sql-server-2008,foreign-keys,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
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语句与外键约束“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
您需要检查两列中的数据 外键表列中有一个值,其关联值在主键表中不存在 starlist.planetid中的数据与planetlist.planetid不匹配/不对应 两者的值必须相同。最好是截断它们,然后尝试创建约束 简言之,存在违反引用完整性规则的情况
如果是这种情况,请记住在填充表之前创建外键。您需要检查两列中的数据 外键表列中有一个值,其关联值在主键表中不存在 starlist.planetid中的数据与planetlist.planetid不匹配/不对应 两者的值必须相同。最好是截断它们,然后尝试创建约束 简言之,存在违反引用完整性规则的情况
如果是这种情况,请记住在填充表之前创建外键。在我看来,这个错误并不是特别模糊。它告诉您至少有一个现有行会导致外键约束失败,因此无法创建它您将得到不符合
约束的行。
。顺便说一句,SQL Server 2008已经完全不受支持一年多了,您应该尽快查看升级路径。@Larnu哦,哇,这很有意义!我从来不知道。我运行了那个查询,在我的starList表中发现了一堆planetID值,而planetList表中不存在这些值。我将删除并重新运行。你认为空值重要吗?因为starList中的planetId列默认为NULL。NULL
值对于外键约束被忽略,@SkyeBoniwell。在我看来,这个错误并不特别模糊。它告诉您至少有一个现有行会导致外键约束失败,因此无法创建它您将得到不符合约束的行。
。顺便说一句,SQL Server 2008已经完全不受支持一年多了,您应该尽快查看升级路径。@Larnu哦,哇,这很有意义!我从来不知道。我运行了那个查询,在我的starList表中发现了一堆planetID值,而planetList表中不存在这些值。我将删除并重新运行。你认为空值重要吗?因为starList中的planetId列默认为NULL。NULL
值对于外键约束被忽略,@SkyeBoniwell。感谢您让我看看,您只需更新:update tbl set col=NULL;或删除并读取该列;改变表格下拉列x;改变表格,增加x列;哦,好的,比如:更新starList SET planetID=NULL,其中planetID不在…截断整个列,然后添加约束。所以没有where条件。谢谢你让我看看,你可以简单地更新:updatetblsetcol=null;或删除并读取该列;改变表格下拉列x;改变表格,增加x列;哦,好的,比如:更新starList SET planetID=NULL,其中planetID不在…截断整个列,然后添加约束。所以没有任何条件。