我想删除子表上的行。我收到错误
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
但是,如何在此设置中删除子项(而非父项)?
可删除的行当前是否无效,可能是在约束尚未使用时添加的,现在在删除具有无效外键的子进程时强制执行约束?
答案 0 :(得分:1)
为什么要使用NOCHECK
添加约束?
来自MSDN documentation ...
如果您不想验证新的CHECK或FOREIGN KEY约束 针对现有数据,使用WITH NOCHECK。 我们不建议这样做 这个,除了极少数情况。新约束将在中进行评估 所有以后的数据更新。任何被抑制的约束违规 通过WITH NOCHECK添加约束可能会导致将来更新 如果他们用不符合的数据更新行,则会失败 约束