2012-10-18 99 views
2

我試圖運行此SQL Server聲明:從表中刪除與同一個表的外鍵約束

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

我得到下面的SQL錯誤:

The DELETE statement conflicted with the SAME TABLE REFERENCE constraint "FK_Company_Company". The conflict occurred in database "DevelopmentDB", table "dbo.Company", column 'ParentID'.

我檢查有沒有公司ParentID = CompanyID。我很好奇爲什麼我的刪除聲明沒有過濾掉那些會導致這個約束被破壞的公司。

回答

2

您是否使用類似的方法驗證了您的嘗試結果,以確保您試圖刪除的內容是您實際想要刪除的內容?

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

您也可以使用子查詢方法嘗試刪除語句。從邏輯上可以更容易地確定您正在運行的查詢是您實際上想要的。

但是,我總是建議首先進行測試,首先進行驗證。

所以運行(如果這是您的預期結果 - 修改如果不是):

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) 
+0

我爲你寫的第二個查詢獲得0行,這讓我感到困惑。如果是這種情況,那麼約束不會是問題,0行將受到影響。 – Dave

+0

零行表示任何有1310以上的companyid都有companyID,它們也是parentID的。您可以嘗試沒有子查詢的select語句來驗證companyid是否存在大於1310. – RThomas

+0

您可以使用我們在此討論的sql的特定風格來更新您的問題。 TSQL,PLSQL,Postgres等等 – RThomas

0

我碰到這個錯誤(「DELETE語句與SAME TABLE REFERENCE約束衝突...」),在這種情況下,我有一個列和數據如下的表:

當我的DELETE命令試圖記錄2.已經成立了 ParentRecordID列在 RecordID列指向同一表的外鍵約束之前,刪除記錄1打
| RecordID | ParentRecordID | (other fields...) | 
|----------|----------------|-------------------| 
|  1 |   null |    ... | 
|  2 |    1 |    ... | 

的錯誤,無法刪除:不會有當記錄1不存在時,記錄2指向記錄1是有效的。

我工作圍繞該問題通過刪除記錄與非空ParentRecordID價值第一:

DELETE FROM myTable 
WHERE ParentRecordID IS NOT null 
    AND (other criteria...) 

然後,我可以繼續進行額外的DELETE語句刪除其餘的記錄:

DELETE FROM myTable 
WHERE (other criteria...)