按过期日期从两个表中同步删除

Synchronized deleting from two tables by expired date

我的数据库中有三个 table:

COMPANY 中的第一个,包括 idnameemail
第二 - COUPON,包括 id, titledatesprice 等...
第三 - 加入 table COMPANY_COUPON,其中包括 id 个公司和 id 个他们拥有的优惠券。

在 java 中,我有一个删除过期优惠券的方法:

DELETE FROM COUPON WHERE END_DATE < CURRENT_DATE

但是删除过期优惠券后,我在COMPANY_ COUPON中还有他们的id加入table,请问如何解决?

@Override
public void removeExpiredCoupons() throws CouponSystemException {

    String delete = "DELETE FROM COUPON WHERE END_DATE < CURRENT_DATE";

    Connection connection = pool.getConnection();

    try (PreparedStatement pstmt = connection.prepareStatement(delete)) {
        pstmt.executeUpdate();

        // This line can be removed
        System.out.println("All expired coupos are removed.");
    } catch (SQLException e) {
        throw new CouponSystemException("Removing expired coupons is failed. ", e);
    } finally {
        pool.returnConnection(connection);
    }
}
  1. 你可以:

先删除company_coupon中的记录table再删除优惠券中的记录table:

首先通过检索过期 ID 的结果集来获取过期 ID 的列表:

select id from coupon where END_DATE < CURRENT_DATE

然后循环遍历结果集删除每个id的记录:

delete from company_coupon where id = idFromLoop

最后删除优惠券的记录table:

delete from coupon where END_DATE < CURRENT_DATE
  1. 你应该:

google "foreign key on delete cascade" 查看如何使用外键删除跨 table 秒的关联记录。

听起来您目前没有定义从 COMPANY_COUPONCOUPON(也不是 COMPANY)的外键约束。这是不可取的,因为它会导致您描述的问题。

如果你想让COMPANY_COUPON中的记录在删除记录时自动删除,你需要定义一个从COMPANY_COUPONCOUPON的外键约束,并使其成为on delete cascade.

例如,您可以添加一个

alter table COMPANY_COUPON 
  add constraint fk_company_coupon_coupon 
    foreign key (COUPON_ID) references COUPON (ID) on delete cascade

你应该做类似于 COMPANY 的事情。