在表“员工”上进行更新或删除违反了外键约束

时间:2018-09-30 14:16:03

标签: sql postgresql foreign-keys cascading-deletes

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

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

id是主键。

有一个名为works_on且具有列

的表名
projectname (varchar), id (numeric)  

在这里,id是引用employee表的外键。

当我尝试像这样从employee表中删除一行时:

delete from employee where id = 1

我收到此错误:

  

对表“ employee”的更新或删除违反了表“ works_on”上的外键约束“ works_on_id_fkey”。

我是数据库管理系统的新手。

有解决方案吗?

2 个答案:

答案 0 :(得分:1)

由于雇员是表works_on中的外键;您之所以无法删除员工ID 1,是因为员工ID 1存在于works_on(或其他可能是员工为外键的表中)上。系统正在尝试通过阻止您删除与works_on关联的员工来维护数据库的完整性。

说,系统使您可以删除员工记录。现在,当您查看works_on表时,员工1与什么相关?您将无法再查找其他信息中的名字/姓氏。因此系统在说:如果要删除员工记录,则必须首先删除/更改外键与其他系统记录的关联;确保其持续的完整性。如果系统允许您执行此操作,则将其称为“孤立”记录。与孩子关联的父记录不再存在。

要解决的几个选项是:

  • 创建一个删除雇员的过程,但首先检查其中雇员为外键的任何表,并确保也可以删除这些表;然后删除这些记录,然后再删除员工记录。 (如果这些表具有与其他表相同的PK,则这些表可能会导致大量的菊花链。但这就是RDBMS的本质。
  • 创建一项功能,使您可以将此类记录分配给员工1的替代者,或删除不再相关的此类记录。
  • 启用ON DELETE CASCADE ON UPDATE CASCADE,,如果删除父记录,它将自动删除子记录。 (在启用之前,请务必谨慎并考虑这如何影响您的系统)Example: Docs
  • 不要删除记录,而是保留一个状态字段,显示活动状态/非活动状态,并将其用作显示或不显示员工及其相关记录的控制机制。
  • 还有其他几种选择要考虑;您必须问自己或正在为其开发业务的公司,以雇员1为外键的所有那些记录应如何处理。删除一些/全部,重新分配一些,删除一些?提示用户如何处理每个实例?只需通知用户,他们必须首先解决在(列出该雇员是否有FK关系的所有位置?)中发现的限制,并确保他们有办法处理所有这些位置...很多选择。

答案 1 :(得分:-2)

您不能通过这种方式删除行。因为它具有约束ID(works_on_id_fkey)。如果要删除,则必须从中删除约束。

alter table employee drop foreign key works_on_id_fkey