0

我无法在 Google 上找到这个。

我正在从表中删除行,而不检查是否由于参照完整性而无法删除某些行。我的想法是删除那些满足它的人。我使用的正是查询 "delete from member_companies" 。

但是,如果发现引用完整性失败的行,我正在使用的 SQL Server 2008 R2 会取消所有删除。

是否有一些指令我可以用来指示它删除可能被删除的行?还是我错过了故事的其他方面?

4

2 回答 2

0

使用 CTE 查找要删除的行,然后将其删除。就像是;

;WITH RowsToDelete AS (
 SELECT comp_id from member_companies mc 
 LEFT JOIN users u on u.comp_id = mc.comp_id 
 WHERE u.comp_id IS NULL
) 
DELETE 
  FROM member_companies 
 WHERE comp_id IN 
(Select comp_id FROM RowsToDelete)
于 2013-02-05T15:07:42.577 回答
0

当对约束使用“WITH NOCHECK”选项时,或者您使用了批量插入或在创建(引用)约束之前,必须加载不匹配引用完整性的行。除了尝试重新应用“WITH NOCHECK”选项(可能有效)之外,您可能只需要删除在其他表中具有匹配行的那些行,例如:

从存在的成员公司 D 中删除 D(从 D.Comany_ID = C.ID 的公司 C 中选择 NULL)

这可以扩展到多个相关表。而且,不,它不应该很慢,因为 EXISTS / NOT EXISTS 应该分别转换为半连接或反半连接(即不是相关的子查询)并且比游标更好。

在 AdventureWorks 示例数据库上使用的示例:

--此示例删除那些不满足约束的行,以反转它删除 NOT。begin tran delete D from Person.StateProvince D where NOT EXISTS(从 Person.Address C 选择 NULL WHERE D.StateProvinceID = C.StateProvinceID)并且不存在(从 Sales.SalesTaxRate C 选择 NULL WHERE D.StateProvinceID = C.StateProvinceID)回滚

于 2013-02-05T14:16:20.957 回答