0

私はこれをGoogleで見つけることができません。

参照整合性のために削除できなかった行があるかどうかを確認せずに、テーブルから行を削除しています。私の考えは、それを満たすものを削除することです。私は "delete from member_companies" というクエリを正確に使用しています。

ただし、私が使用している SQL Server 2008 R2 は、参照整合性に失敗した行が見つかった場合、すべての削除をキャンセルします。

削除可能な行を削除するように指示するために使用できるディレクティブはありますか? それとも、ストーリーの他の側面が欠けていますか?

4

2 に答える 2

0

参照整合性に一致しない行は、"WITH NOCHECK" オプションが制約で使用されたとき、または一括挿入を使用したとき、または (参照) 制約が作成される前に読み込まれている必要があります。「WITH NOCHECK」オプションを再適用しようとすることは別として(うまくいくかもしれません)、おそらく、他のテーブルに一致する行がある行を次のように削除する必要があります。

存在する member_companys 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 WHERE D.StateProvinceID = C.StateProvinceID から NULL を選択) AND NOT EXISTS(Sales.SalesTaxRate C WHERE D.StateProvinceID = C.StateProvinceID から NULL を選択) ロールバック

于 2013-02-05T14:16:20.957 に答える
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 に答える