mysql - 级联删除具有非级联外键的行

标签 mysql jpa eclipselink cascade

我有一个带有一些外键的数据库,这些外键没有配置ON DELETE CASCADE;如果可能的话,我想避免改变它。同样,我们的 JPA 关系也没有配置 cascade = CascadeType.REMOVE

是否仍然可以“以级联模式”删除实体,即自动为其子项生成所有必要的删除查询?

理想情况下,我想通过 JPA 来完成,但原始 SQL 查询也可以。主要问题是并非所有(但大多数)外键约束都反射(reflect)在 JPA 关系中,例如 OneToOneOneToMany 等。

最佳答案

我不知道 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/

相关文章:

java - 从 DATE 到 java.time.LocalDate 的 JPA 转换器不适用于 Glassfish 4.1

java - 级联持久上的 Eclipselink 查询缓存失效

php - 使用 jQuery AJAX 将数据传递到 PHP 脚本

java - 如何在 Spring/Hibernate 事务中包装 Wicket 页面渲染?

java - 类似条件在 JPA @Query 中不起作用

java - 当 FetchType 为 LAZY 时获取嵌套对象

php - 给 Mysql 列一个仅由数字组成的名称

php - Wordpress 选项页面中动态生成的下拉列表

php - 与 wamp 相比,服务器上的内存使用率较高

java - 没有 setter 的 JPA 2.0 持久属性