我有几个表从服务器定期更新(
每当服务器上的
但是当我使用
(类似的问题也出现在
我正在寻找一种方法,可以在事务结束之前暂时禁用外键约束。也就是说,在事务期间不验证外键,但只在事务结束时进行验证。 我仍希望Room自动删除没有有效父项的实体。
Benefit
, Branch
, Coupon
),还有两个本地表(FavoriteBenefit
, UsedCoupon
)。ER图如下:
![ER diagram](https://istack.dev59.com/74jv8.webp)
Benefit
被删除时,我也想从FavoriteBenefit
中删除相应的实体。为此,我可以使用onDelete = ForeignKey.CASCADE
,只要父级Benefit
不再存在于数据库中,FavoriteBenefit
也会被删除。听起来很好。但是当我使用
@Insert(onConflict = OnConflictStrategy.REPLACE)
来更新数据库中的福利时,问题就出现了。实际上,REPLACE
执行了DELETE
和INSERT
,但DELETE
在内部触发了FavoriteBenefit
的onDelete
,导致该表中的所有数据也被删除了。(类似的问题也出现在
Coupon
和 UsedCoupon
表中。)
我正在寻找一种方法,可以在事务结束之前暂时禁用外键约束。也就是说,在事务期间不验证外键,但只在事务结束时进行验证。 我仍希望Room自动删除没有有效父项的实体。
看起来通过在@ForeignKey
定义上设置deferred = true
来标记外键为延迟应该正是我想要实现的。
boolean deferred ()
外键约束可以推迟到事务完成时再执行。如果您正在单个事务中对数据库进行批量插入,则此功能非常有用。默认情况下,外键约束是立即执行的,但您可以通过将此字段设置为true来更改它。
但是,即使我设置了deferred
标志,似乎也没有任何效果,因为每次仍然会删除FavoriteBenefit
。
我是否错误地理解了deferred
标志?