2013-02-05 29 views
0

我不想在Google上找到它。刪除行以跨過那些不能完成參照完整性的行

我從表中刪除行而不檢查是否因參照完整性而無法刪除。我的想法是刪除那些實現它的人。我正在使用查詢「從member_companies刪除」。

但是,我正在使用的SQL Server 2008 R2會取消所有刪除行,如果找不到引用完整性的行。

是否有一些指令可以用來指示它刪除可能被刪除的行?或者我錯過了故事的其他方面?

+0

我認爲該模式將使這個遊標,然後遍歷每行發出刪除,然後忽略與例外。 – Randy

+0

請發佈您的架構,示例數據以及您想要刪除的內容。這可能可以通過一些連接和/或不插入來完成...... – sgeddes

+0

我完全是這樣做的。問題在於表中包含很多行,而行刪除會觸發級聯刪除,所以查詢通常會持續很長時間。我正在尋找一個標準的查詢替代方案,該方法應該更短 –

回答

0

當約束上使用「WITH NOCHECK」選項時,或者您已經使用批量插入或在創建(引用)約束之前,不匹配參照完整性的行必須已經加載。 除了試圖重新應用「WITH NOCHECK」選項(可能有效)之外,您可能需要刪除那些在其他表格中具有匹配行的行,如下所示:

刪除D from member_companies D where exists(從D.Comany_ID = C.ID的公司C中選擇NULL)

這可以擴展到多個相關的表。並且,不應該緩慢,因爲EXISTS/NOT EXISTS應該分別翻譯爲半連接或反半連接(即不是相關的子查詢)並且優於遊標。

實施例用於AdventureWorks示例數據庫上使用:

--This清除樣品的那些行不滿足約束,扭轉它除去NOT。 開始從Person.StateProvince d TRAN 刪除d 其中NOT EXISTS(選擇從Person.Address c其中D.StateProvinceID = C.StateProvinceID NULL) AND NOT EXISTS(從Sales.SalesTaxRate C優先選擇NULL WHERE D.StateProvinceID = C.StateProvinceID) 回滾

+0

我想我們在這裏誤解了一下 - 沒有表格數據可以打破參照完整性,這個狀態是一致的。我只是想知道是否有一個指示服務器刪除行的指令,只需簡單地從table_name查詢中刪除,其刪除不會破壞參照完整性規則。假設沒有爲此設置級聯刪除。不過,我認爲你答案的最後一部分是解決問題的另一種方法。 –

+0

我只是想知道是否存在一個指令,我可以調用「DELETE FROM MEMBER_COMPANIES STEP_OVER_ROWS_WHOSE_REMOVAL_WILL_BREAK_REFERENTIAL_INTEGRITY」並期望得到結果。 –

+1

沒有指示要做到這一點。只有在您創建約束時應用於約束的NOCHECK,留下可能破壞新(參照完整性)約束的任何現有數據。您當然可以刪除並重新創建(參照完整性)約束。最後,我給出的AdventureWorks示例只刪除了「剩餘」行,即那些不會破壞Person.StateProvince上的任何inetgrity約束的行。 –

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)