我有一个带有一些外键的数据库,这些外键没有配置ON DELETE CASCADE
;如果可能的话,我想避免改变它。同样,我们的 JPA 关系也没有配置 cascade = CascadeType.REMOVE
。
是否仍然可以“以级联模式”删除实体,即自动为其子项生成所有必要的删除查询?
理想情况下,我想通过 JPA 来完成,但原始 SQL 查询也可以。主要问题是并非所有(但大多数)外键约束都反射(reflect)在 JPA 关系中,例如 OneToOne
、OneToMany
等。
最佳答案
我不知道 JPA,所以请注意我下面代码中的美元符号,它们表示变量。因此,正如已经建议的那样,您可以将级联编写为触发器。
如果您需要对您将要使用的某些逻辑进行强化:
假设你有:
table_1
,主实体表table_2
,与table_1
具有一对多关系的“多”表
... 并且 table_1
有一个 FKEY 到 table_2
:
delete from table_2 where id in (select table_2_id from table_1 where id = $table_1_id)
或者说 FKEY 在对面的 table 上:
delete from table_2 where table_1_id = $table_1_id
或者说你有:
table_1
,主要实体table_2
,与table_1
具有多对多关系的关联实体表
link_table
,仅由两个FKEY和一个row id组成,记录多对多关联- 你只想删除因为 M2M 关系的关联
delete from link_table where table_1_id = $table_1_id
或者也许这是一些主记录,多对多关系应该级联删除...
delete from table_2 where id in (select table_2_id from link_table where table_1_id = $table_1_id);
delete from link_table where table_1_id = $table_1_id;
关于mysql - 级联删除具有非级联外键的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59480884/