-1

我想删除子表上的行。我收到错误

DELETE 语句与 REFERENCE 约束“FK_Address_UserDataSet”冲突。冲突发生在数据库“XYZ”、表“dbo.Address”、列“DataSetId”中。该语句已终止。

我有一个带有父表UserDataSet和子 Address表的数据库结构(父表可以有任意数量的子表)。

有一个外键约束(在错误中提到)要求孩子DataSetId与有效的UserDataSet.

以下是以MS SQL Server Management Studio 2008简化形式创建的表和约束脚本:

CREATE TABLE [dbo].[Address](
    [AddressId] [int] IDENTITY(1,1) NOT NULL,
    [DataSetId] [int] NOT NULL,
        --other fields
 CONSTRAINT [PK_Address] PRIMARY KEY CLUSTERED 
(
    [AddressId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

---

CREATE TABLE [dbo].[UserDataSet](
    [DataSetId] [int] IDENTITY(1,1) NOT NULL,
        --other fields
 CONSTRAINT [PK_UserDataSet] PRIMARY KEY CLUSTERED 
(
    [DataSetId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

---Create the constraint

ALTER TABLE [dbo].[Address]  WITH NOCHECK ADD  CONSTRAINT [FK_Address_UserDataSet] FOREIGN KEY([DataSetId])
REFERENCES [dbo].[UserDataSet] ([DataSetId])
GO

ALTER TABLE [dbo].[Address] CHECK CONSTRAINT [FK_Address_UserDataSet]
GO

但是,在这个设置中删除一个孩子(而不是父母)怎么会成为一个问题呢?

是否可能是要删除的行当前无效,可能是在约束尚未(尚未)使用时添加的),现在在删除具有无效外键的子项时强制执行约束?

4

1 回答 1

1

为什么要添加约束NOCHECK

MSDN 文档...

如果您不想针对现有数据验证新的 CHECK 或 FOREIGN KEY 约束,请使用 WITH NOCHECK。我们不建议这样做,除非在极少数情况下。新约束将在以后的所有数据更新中进行评估。在添加约束时由 WITH NOCHECK 抑制的任何约束违规都可能导致将来的更新失败,如果它们使用不符合约束的数据更新行。

于 2013-02-15T13:56:55.197 回答