我的数据库中有三个表:
COMPANY
中的第一个,其中包括id
,name
和email
。
第二个-COUPON
,其中包含ID ,
title
,dates
,price
等...
第三-联接表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);
}
}
答案 0 :(得分:4)
听起来您当前没有从COMPANY_COUPON
到COUPON
(也不是COMPANY
)定义的外键约束。这是不希望的,因为它会导致您所描述的问题。
如果要删除记录中的COMPANY_COUPON
中的记录,则需要从COMPANY_COUPON
到COUPON
定义外键约束并将其设置为{{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)
在删除优惠券表中的记录之前先删除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
google“删除级联上的外键”以了解如何使用外键删除表中的关联记录。