删除子项时是否对DELETE强制执行外键约束?

时间:2013-02-15 12:31:27

标签: sql-server-2005 parent-child foreign-key-relationship

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

  

DELETE语句与REFERENCE约束冲突   “FK_Address_UserDataSet”。冲突发生在   数据库“XYZ”,表“dbo.Address”,列   “资料集”。该声明已被终止。

我有一个数据库结构,其中包含父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

但是,如何在此设置中删除子项(而非父项)?

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

1 个答案:

答案 0 :(得分:1)

为什么要使用NOCHECK添加约束?

来自MSDN documentation ...

  

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