簡體   English   中英

在表“員工”上進行更新或刪除違反了外鍵約束

[英]update or delete on table “employee” violates foreign key constraint

我有一個employee表,其中包含以下列:

fname (varchar), lname (varchar), id (numeric)  

id是主鍵。

有一個名為works_on的表名,帶有列

projectname (varchar), id (numeric)  

在此, id是引用employee表的外鍵。

當我嘗試從employee表中刪除一行時,如下所示:

delete from employee where id = 1

我收到此錯誤:

表“員工”上的更新或刪除違反了表“ works_on”上的外鍵約束“ works_on_id_fkey”。

我是數據庫管理系統的新手。

有什么辦法嗎?

由於雇員是表works_on的外鍵; 您之所以無法刪除員工ID 1,是因為在works_on (或者其他表中員工是外鍵的表)上存在員工ID 1。 系統正在嘗試通過防止您刪除與works_on關聯的雇員來維護數據庫的完整性。

說系統讓您刪除員工記錄。 現在,當您查看works_on表時,員工1與什么相關? 您將無法再查找其他信息中的名字/姓氏。 因此系統在說:如果要刪除員工記錄,則必須首先刪除/更改外鍵與其他系統記錄的關聯; 確保其持續的完整性。 如果系統允許您執行此操作,則將其稱為“孤立”記錄。 子級關聯的父級記錄不再存在。

要解決的幾個選項是:

  • 創建一個刪除雇員的過程,但首先檢查其中雇員為外鍵的所有表,並確保也可以刪除這些表; 然后刪除這些記錄,然后再刪除員工記錄。 (如果這些表具有與其他表相同的PK,則可能導致大量的菊花鏈。但這就是RDBMS的本質。
  • 創建一個功能,使您可以將此類記錄分配給員工1的替代者,或刪除不再相關的此類記錄。
  • 啟用ON DELETE CASCADE ON UPDATE CASCADE,如果刪除父記錄,它將自動刪除子記錄。 (在啟用前,請務必謹慎並考慮這對系統的影響) 示例: 文檔
  • 不要刪除記錄,而要保留一個狀態字段,顯示活動狀態/非活動狀態,並將其用作顯示或不顯示員工及其相關記錄的控制機制。
  • 還有其他幾種選擇; 您必須問自己或正在為其開發業務的公司,以雇員1為外鍵的所有那些記錄應如何處理。 刪除一些/全部,重新分配一些,刪除一些? 提示用戶如何處理每個實例? 只需通知用戶,他們必須首先解決在(列出該雇員是否有FK關系的所有位置?)中發現的限制,並確保他們有辦法處理所有這些位置...很多選擇。

您不能通過這種方式刪除行。 因為它具有約束ID(works_on_id_fkey)。 如果要刪除,則必須從中刪除約束。

alter table employee drop foreign key works_on_id_fkey

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM