具有外键约束的SQL删除查询

4

我知道这个问题属于数据库理论的早期阶段,但是我几个月以来没有遇到过这样的问题。如果有人有一个数据库,其中一些表通过外键相互关联成为“链”,并且他们想要从一个具有一些“依赖”表的表中删除记录,会出现什么障碍?特别是,在一个包含表Person、Profile、Preference、Filter的数据库中,存在以下关联:Person.idProfile中的外键,Profile.idPreference中的外键,Filter.idPreference中的外键,因此所有关联都是OneToMany。是否可以使用简单的查询删除一个Person:

Delete from Person p where p.id= 34;

如果不能成功删除,该查询应该是什么样子?如果应用程序中的数据库由Hibernate管理,那么应该对每个实体的相关字段应用哪些约束(注释),以便能够使用上述简单查询来执行删除操作?

如果Profile和Preference表对PersonId记录有外键约束,并且您尝试从Person表中删除该人员ID,则会违反约束。您需要在每个适用约束的表中执行级联删除或删除该人员ID。 - Darren
2个回答

2

针对SQL版本

enter image description here

请查看截图。您可以使用插入更新规则。因为它有删除和更新规则,所以您可以设置其中任一值。

外键约束可以通过引用主键或唯一键来创建。外键约束确保关联表中数据的关系完整性。外键值可能为空,表示特定记录没有父记录。但是,如果存在一个值,则必须在父表中有一个关联值。在对父表应用更新或删除操作时,对子表中关联值的影响可能有不同的要求。SQL Server 2005和2008提供了四个可用选项,如下:

No Action
Cascade
SET NULL
SET Default

请参考以下文章。

http://www.mssqltips.com/sqlservertip/2365/sql-server-foreign-key-update-and-delete-rules/

ORACLE版本

您可以使用下列之一。

1. 不执行任何操作:

alter table sample1 add foreign key (col1) references sample (col2) on delete no action;

2. 限制删除:

alter table sample1 add foreign key (col1) references sample (col2) on delete restrict;

3. 级联删除:

alter table sample1 add foreign key (col1) references sample (col2) on delete cascade;

更多参考信息,请查看以下链接。

http://docs.oracle.com/cd/B19306_01/server.102/b14200/clauses002.htm


这个问题被标记为 Oracle - MatBailie
@Jodha - SQL标签代表语言,而不是特定的关系型数据库管理系统。 - Damien_The_Unbeliever

0

如果存在外键约束,则答案是否定的,您必须首先删除叶节点表数据。

首先从Preference表中删除

然后从Profile和Filter表中删除

最后从Person table中删除记录

这是您可以应用于任何地方的通用概念。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接