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

时间:2018-12-21 19:14:20

标签: java sql jdbc foreign-keys derby

我的数据库中有三个表:

COMPANY中的第一个,其中包括idnameemail
第二个-COUPON,其中包含ID , titledatesprice等...
第三-联接表COMPANY_COUPON,其中包含id个公司和id所拥有的优惠券。

在Java中,我有一种使用以下方法删除过期优惠券的方法:

DELETE FROM COUPON WHERE END_DATE < CURRENT_DATE

但是在删除过期的优惠券后,id联接表中仍然有它们的COMPANY_ COUPON,我该如何解决?

@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);
    }
}

2 个答案:

答案 0 :(得分:4)

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

如果要删除记录中的COMPANY_COUPON中的记录,则需要从COMPANY_COUPONCOUPON定义外键约束并将其设置为{{1} }。

例如,您可以添加一个与

on delete cascade

您应该执行类似于alter table COMPANY_COUPON add constraint fk_company_coupon_coupon foreign key (COUPON_ID) references COUPON (ID) on delete cascade 的操作。

答案 1 :(得分:0)

  1. 您应该:

在删除优惠券表中的记录之前先删除company_coupon表中的记录:

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

select id from coupon where END_DATE < CURRENT_DATE

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

delete from company_coupon where id = idFromLoop

最后从优惠券表中删除记录:

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

google“删除级联上的外键”以了解如何使用外键删除表中的关联记录。