Синхронное удаление из двух таблиц по истечении срока - PullRequest
0 голосов
/ 21 декабря 2018

В моей базе данных три таблицы:

Первая из COMPANY включает id, name и email.
Вторая - COUPON включает идентификатор , 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);
    }
}

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Похоже, у вас в настоящее время нет ограничений внешнего ключа, заданных от 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.

0 голосов
/ 21 декабря 2018
  1. вы МОЖЕТЕ:

удалить записи в таблице company_coupon перед удалением записей в таблице купонов:

сначала получить список идентификаторов с истекшим сроком действия, получиврезультирующий набор идентификаторов с истекшим сроком действия:

select id from coupon where END_DATE < CURRENT_DATE

, затем циклический просмотр набора результатов для удаления записей каждого идентификатора:

delete from company_coupon where id = idFromLoop

, последнее удаление записей из таблицы купонов:

delete from coupon where END_DATE < CURRENT_DATE
Вам СЛЕДУЕТ:

google "внешний ключ при удалении каскада", чтобы узнать, как использовать внешний ключ для удаления связанных записей между таблицами.

...