Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “更新或删除表上的内容”;“雇员”;违反外键约束_Sql_Postgresql_Foreign Keys_Cascading Deletes - Fatal编程技术网

Sql “更新或删除表上的内容”;“雇员”;违反外键约束

Sql “更新或删除表上的内容”;“雇员”;违反外键约束,sql,postgresql,foreign-keys,cascading-deletes,Sql,Postgresql,Foreign Keys,Cascading Deletes,我有一个employee表,表中有以下列: fname (varchar), lname (varchar), id (numeric) id是主键 有一个名为的表名对列起作用 projectname (varchar), id (numeric) 这里,id是引用employee表的外键 当我试图从employee表中删除一行时,如下所示: delete from employee where id = 1 我得到这个错误: 表“employee”上的更新或删除违反了表“work

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

fname (varchar), lname (varchar), id (numeric)  
id
是主键

有一个名为
的表名对列起作用

projectname (varchar), id (numeric)  
这里,
id
是引用
employee
表的外键

当我试图从
employee
表中删除一行时,如下所示:

delete from employee where id = 1
我得到这个错误:

表“employee”上的更新或删除违反了表“works\u on”``上的外键约束“works\u on\u id\u fkey”

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


有解决方案吗?

您不能通过这种方式删除行。因为它包含约束id(在id上工作)。如果要删除,必须从中删除约束

alter table employee drop foreign key works_on_id_fkey

因为employee是表
中的外键;无法删除员工ID 1的原因是,员工ID 1存在于
工作于
(或者其他表中的员工是外键)。系统试图通过阻止您删除隶属于
工作
的员工来维护数据库的完整性

假设系统允许您删除员工记录。现在,当您查看
表上的
works\u时,员工1与什么相关?您不能再在其他信息中查找名字/姓氏。因此,系统会说:如果要删除员工记录,必须首先删除/更改与其他系统记录的外键关联;以确保其持续的完整性。如果系统允许您这样做,它将被称为“孤立”记录。子关联的父记录已不存在

要解决此问题,有以下几种选择:

  • 创建一个删除雇员的过程,但首先检查雇员是外键的任何表,并确保删除这些表也是可以的;然后在删除员工记录之前删除这些记录。(如果这些表的主键与其他表的主键相同,这可能会导致大量菊花链。但这是RDBMS的本质
  • 创建一个功能,允许您将此类记录分配给员工1的替代者,或者在不再相关时删除此类记录
  • < List>在更新级联删除级联时,如果父记录被删除,它将自动删除子记录。(非常小心并考虑这在启用之前对系统的影响)
  • 不要删除记录,而是维护一个显示活动/非活动的状态字段,并将其用作显示或不显示员工及其关联记录的控制机制
  • <> LI>还有几个其他的选择要考虑;你必须问问自己,或者正在开发的业务,所有那些雇员1是外键的记录应该发生什么。删除一些/全部,重新分配一些删除一些?提示用户如何处理每一个实例?简单地通知用户他们必须是FIRS。t解决在(列出该员工与FK有关系的所有地点?)中发现的限制,并确保他们有办法处理所有这些地点…有很多选择
禁用数据库完整性…这似乎是明智之举吗?检查相关记录是否也应删除并删除这些记录如何。或者启用表DDL上的级联删除。有人出于某种原因设置了具有此关系的数据库。我们为什么要绕过它?这不是明智之举?当然,这不是sm艺术搬家,当我们在一个有几百个表格的大数据库上工作时,我们不能这么做。但是他对DBMS是新的,他会在完全理解主键、外键和约束的时候找到答案……我道歉。我的目的是让你考虑一个更完整的回答。如果这个问题继续解释为什么它会起作用,而是这样做的后果;或者在保持完整性的同时提供其他选择,我很乐意收回我的评论。目前来看,如果用户实施了它,它将对数据库的完整性造成损害,并且对正确教育被问的问题没有任何作用。(这两个难题学校都失败了:P)是的,我明白你想说什么,我知道这样做会给整个数据库带来严重的问题。但是提问者必须知道什么是外键以及它对表中其他元素的影响。通过问这个问题,他必须是DBMS的新成员。我确信他在删除该行后会明白,是不是这样是否可以通过在delete cascade上添加update cascade来更改employee表?答案是:否。但这适用于版本8,可能是之前的版本,我不知道您使用的是哪个版本。虽然PostgreSQL网站上的这个问答似乎表明它可以工作:我没有PostgreSQL环境来知道哪个可以工作;但我相信他们的onli东北部文件。