4

このSQLサーバーステートメントを実行しようとしています:

delete C from Company C, Company D where C.CompanyID > 1310 AND C.CompanyID != D.ParentID

次の sql エラーが発生します。

DELETE ステートメントは、SAME TABLE REFERENCE 制約 "FK_Company_Company" と競合しました。データベース「DevelopmentDB」、テーブル「dbo.Company」、列「ParentID」で競合が発生しました。

確認したところ、ParentID = CompanyID の会社はありません。私の削除ステートメントが、この制約を破る原因となる会社を除外していないのはなぜでしょうか。

4

2 に答える 2

3

削除しようとしているものが実際に削除しようとしているものであることを確認するために、このような試みの結果を検証しましたか?

select C.<field list> from Company C, Company D 
where C.CompanyID > 1310 AND C.CompanyID != D.ParentID

サブクエリアプローチを使用してdeleteステートメントを試すこともできます。実行しているクエリが実際に意図しているものであることを論理的に識別しやすくなる場合があります。

ただし、検証のために最初にselectを使用してテストすることを常にお勧めします。

したがって、実行します(これが意図した結果である場合-そうでない場合は変更します):

Select <field list> FROM Company WHERE CompanyID > 1310 
AND CompanyID NOT IN 
    (SELECT ParentID FROM Company)

実行する前に(これも単なる例です):

DELETE Company WHERE CompanyID > 1310 
AND CompanyID NOT IN 
    (SELECT ParentID FROM Company)
于 2012-10-18T18:11:45.393 に答える