假设Oracle 10G中有两个表
TableA (Parent) --> TableB (Child)
TableA中的每一行在TableB中都有与其相关的几个子行。
我想删除TableA中的特定行,这意味着我必须先删除tableB中的相关行。
这将删除子条目
delete from tableB where last_update_Dtm = sysdate-30;
要删除子表中刚刚删除的行的父行,我可以这样做
Delete from TableA where not exists (select 1 from tableB where tableA.key=tableB.key);
上面还将删除子表中的行,其中(last_update_Dtm =
sysdate-30)为false。TableA没有last_update_dtm列,因此如果没有子表中的条目,则无法知道要删除哪些行。
我可以在删除之前将键保存在子表中,但这似乎是一种昂贵的方法。删除两个表中的行的正确方法是什么?
为了更好地解释我要实现的目标,如果两个表之间没有约束,则以下查询将完成我要实现的目标。
Delete from tableA
Where exists (
Select 1 from tableB
where tableA.key=tableB.key
and tableB.last_update_dtm=sysdate-30)
Delete from tableB where last_update_dtm=systdate-30
两种可能的方法。
如果您有外键,请将其声明为on-delete-cascade并删除30天以上的父行。所有子行将被自动删除。
根据您的描述,您似乎知道要删除的父行,并且需要删除相应的子行。您是否尝试过这样的SQL?
delete from child_table
where parent_id in (
select parent_id from parent_table
where updd_tms != (sysdate-30)
-现在删除父表记录
delete from parent_table
where updd_tms != (sysdate-30);
-—根据您的要求,看来您可能必须使用PL / SQL。我将看看是否有人可以为此发布一个纯SQL解决方案(在这种情况下,肯定是这样)。
declare
v_sqlcode number;
PRAGMA EXCEPTION_INIT(foreign_key_violated, -02291);
begin
for v_rec in (select parent_id, child id from child_table
where updd_tms != (sysdate-30) ) loop
-- delete the children
delete from child_table where child_id = v_rec.child_id;
-- delete the parent. If we get foreign key violation,
-- stop this step and continue the loop
begin
delete from parent_table
where parent_id = v_rec.parent_id;
exception
when foreign_key_violated
then null;
end;
end loop;
end;
/
问题内容: 我准备了一个 小提琴 来演示这个问题。 我想要一种在删除子记录时将其删除到CASCADE到父记录的方法。 例如: 这应该级联到父表并删除记录。 问题答案: 外键仅在另一个方向上起作用:从父级到子级级联删除,因此,当删除父级(引用)记录时,所有子级(引用)记录也会被删除。 如果是1:1关系,则可以创建双向外键关系,其中一侧为,而两侧均为级联。 否则,您将需要在子表上创建一个触发器,以在没
问题内容: 假设我们有3个Entities对象类: 如何使用JPA2.x(或hibernate)批注来: 父级删除时(一对多)自动删除所有子级 删除后自动从子级列表中删除子级(多对一) 儿童删除时(一对一)自动删除玩具 我正在使用Hibernate 4.3.5和mysql 5.1.30。 谢谢 问题答案: 如本文所述, 实体状态转换应从父级到子级联,而不是相反。 您需要这样的东西:
问题内容: 我有以下实体: 球队 } 和 USER_TEAM_ROLE 现在,当使用{UTR1,UTR3}更新包含例如Team.userTeamRoles = {UTR1,UTR2}的Team实体时,我希望删除UTR2。但是我现在的方法是,旧列表保持不变,并且只将UTR3添加到列表中。 这是我目前的做法: 我认为通过执行该列表将被重置,并且由于级联,先前的列表将被删除。 任何帮助表示赞赏。谢谢 问
我已经创建了纸张和Mcq问题之间的映射如下。 } 当我更新纸质实体时,它会删除所有MCQ。 SQL输出:
问题内容: 我在Hibernate中有标准协会。更新时,我正在创建新实体(使用关键字),并用必要的值(还插入ID)填充它。值来自UI。以相同的方式,我创建了子对象的新集合,用值(也插入了ID)填充每个子对象,并将集合存储在父对象中(使用setter或按方法)。 所以我的问题是:如何在更新父级时删除父级集合中的所有对象,并用新的集合替换它们。在新集合中,某些对象确实是新对象,而某些对象仅需要更新(它
我尝试使用下面的代码从XML下面删除scheme-details1,但无法删除。 其中是。 以下是我的XML响应:-