按过期日期从两个表中同步删除
Synchronized deleting from two tables by expired date
我的数据库中有三个 table:
COMPANY
中的第一个,包括 id
、name
和 email
。
第二 - COUPON
,包括 id,
title
、dates
、price
等...
第三 - 加入 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);
}
}
- 你可以:
先删除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
- 你应该:
google "foreign key on delete cascade" 查看如何使用外键删除跨 table 秒的关联记录。
听起来您目前没有定义从 COMPANY_COUPON
到 COUPON
(也不是 COMPANY
)的外键约束。这是不可取的,因为它会导致您描述的问题。
如果你想让COMPANY_COUPON
中的记录在删除记录时自动删除,你需要定义一个从COMPANY_COUPON
到COUPON
的外键约束,并使其成为on delete cascade
.
例如,您可以添加一个
alter table COMPANY_COUPON
add constraint fk_company_coupon_coupon
foreign key (COUPON_ID) references COUPON (ID) on delete cascade
你应该做类似于 COMPANY
的事情。
我的数据库中有三个 table:
COMPANY
中的第一个,包括 id
、name
和 email
。
第二 - COUPON
,包括 id,
title
、dates
、price
等...
第三 - 加入 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);
}
}
- 你可以:
先删除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
- 你应该:
google "foreign key on delete cascade" 查看如何使用外键删除跨 table 秒的关联记录。
听起来您目前没有定义从 COMPANY_COUPON
到 COUPON
(也不是 COMPANY
)的外键约束。这是不可取的,因为它会导致您描述的问题。
如果你想让COMPANY_COUPON
中的记录在删除记录时自动删除,你需要定义一个从COMPANY_COUPON
到COUPON
的外键约束,并使其成为on delete cascade
.
例如,您可以添加一个
alter table COMPANY_COUPON
add constraint fk_company_coupon_coupon
foreign key (COUPON_ID) references COUPON (ID) on delete cascade
你应该做类似于 COMPANY
的事情。