我无法在 Google 上找到这个。
我正在从表中删除行,而不检查是否由于参照完整性而无法删除某些行。我的想法是删除那些满足它的人。我使用的正是查询 "delete from member_companies" 。
但是,如果发现引用完整性失败的行,我正在使用的 SQL Server 2008 R2 会取消所有删除。
是否有一些指令我可以用来指示它删除可能被删除的行?还是我错过了故事的其他方面?
我无法在 Google 上找到这个。
我正在从表中删除行,而不检查是否由于参照完整性而无法删除某些行。我的想法是删除那些满足它的人。我使用的正是查询 "delete from member_companies" 。
但是,如果发现引用完整性失败的行,我正在使用的 SQL Server 2008 R2 会取消所有删除。
是否有一些指令我可以用来指示它删除可能被删除的行?还是我错过了故事的其他方面?
使用 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)
当对约束使用“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)回滚