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

Java 按过期日期从两个表中同步删除,java,sql,jdbc,foreign-keys,derby,Java,Sql,Jdbc,Foreign Keys,Derby,我的数据库中有三个表: COMPANY中的第一个,包括id、name和email 第二种-优惠券,包括id,标题,日期,价格等。 第三个-联接表COMPANY\u优惠券,其中包括公司的id,以及他们所拥有优惠券的id 在java中,我有一个删除过期优惠券的方法,使用: DELETE FROM COUPON WHERE END_DATE < CURRENT_DATE 你可以: 在删除优惠券表中的记录之前,先删除公司优惠券表中的记录: delete from coupon where END

我的数据库中有三个表:

COMPANY
中的第一个,包括
id
name
email

第二种-
优惠券
,包括id
标题
日期
价格
等。
第三个-联接表
COMPANY\u优惠券
,其中包括公司的
id
,以及他们所拥有优惠券的
id

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

DELETE FROM COUPON WHERE END_DATE < CURRENT_DATE
  • 你可以:
  • 在删除优惠券表中的记录之前,先删除公司优惠券表中的记录:

    delete from coupon where END_DATE < CURRENT_DATE
    
    首先通过检索过期id的结果集获取过期id的列表:

    select id from coupon where END_DATE < CURRENT_DATE
    
    最后,从优惠券表中删除记录:

    delete from coupon where END_DATE < CURRENT_DATE
    
    从结束日期<当前日期的优惠券中删除
    
  • 你应该:
  • google“删除级联上的外键”,了解如何使用外键删除表中的关联记录

  • 你可以:
  • 在删除优惠券表中的记录之前,先删除公司优惠券表中的记录:

    delete from coupon where END_DATE < CURRENT_DATE
    
    首先通过检索过期id的结果集获取过期id的列表:

    select id from coupon where END_DATE < CURRENT_DATE
    
    最后,从优惠券表中删除记录:

    delete from coupon where END_DATE < CURRENT_DATE
    
    从结束日期<当前日期的优惠券中删除
    
  • 你应该:

  • 谷歌“删除级联上的外键”查看如何使用外键删除表中的关联记录。

    听起来您目前没有定义从
    公司优惠券到
    优惠券(或
    公司
    )的外键约束。这是不可取的,因为它正是您描述的问题的结果

    如果要在删除记录时自动删除
    公司优惠券
    中的记录,则需要定义一个从
    公司优惠券
    优惠券
    的外键约束,并将其设置为删除级联上的

    例如,您可以添加一个带有

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

    您应该执行类似于
    公司
    的操作。听起来您当前没有定义从
    公司优惠券
    优惠券
    (也没有定义到
    公司
    )的外键约束。这是不可取的,因为它正是您描述的问题的结果

    如果要在删除记录时自动删除
    公司优惠券
    中的记录,则需要定义一个从
    公司优惠券
    优惠券
    的外键约束,并将其设置为删除级联上的

    例如,您可以添加一个带有

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


    您应该执行类似于
    COMPANY

    的操作,以相同的方法从第二个表中删除行?您可能还可以编写一个触发器从第二个表中删除。您是否对删除引用行时自动删除引用值的过程有疑问?将公司设置为公司优惠券表的所有者会自动删除它,然而,对于优惠券,您需要在方法中添加一行,例如:company.coups.remove(优惠券)@andret您要删除的第一件事是仅从优惠券表中删除数据。您还需要从公司优惠券中删除关联。此外,看起来您没有对表使用任何约束。我建议您向关联表中添加一些约束,并首先从关联表中删除数据,然后从优惠券表中删除数据。@MS90您说“外键约束已经存在”。我指出这是不可能的,因为如果是这样的话,那么要么删除被禁止(因为默认的约束是关于删除限制的
    ),要么他就不必问这个问题(因为约束会自动删除
    公司优惠券
    中的记录)。换句话说,他需要在delete cascade
    上添加一个带有
    的外键约束,而不仅仅是添加一个引用操作。删除行使用相同的方法从第二个表中删除?您可能还可以编写一个触发器从第二个表中删除。您是否对删除引用行时自动删除引用值的过程有疑问?将公司设置为公司优惠券表的所有者将自动删除它,但对于优惠券,您需要添加在您的方法中使用类似于:company.coups.remove(优惠券)的行@andrew您要删除的第一件事是仅从优惠券表中删除数据。您还需要从公司优惠券中删除关联。此外,您似乎没有对表使用任何约束。我建议您先向关联表添加一些约束,然后从关联表中删除数据。@MS90你说“外键约束已经存在”。我指出这是不可能的,因为如果是这样的话,那么要么删除将被禁止(因为默认的约束是delete restrict上的
    ),要么他就不必问这个问题(因为约束会自动删除
    公司优惠券中的记录)换句话说,他需要在删除级联时添加一个带有
    的外键约束,而不仅仅是添加一个引用操作。虽然这是可行的,但数据库有内置的功能,可以为您做到这一点:无需手动操作。在我看来,我将尝试它。因此,只有当我只有一张过期优惠券时,它才有效……但我会感谢的,虽然这是可行的,但数据库有内置的功能,可以为您做到这一点:无需手动操作。我会尝试一下,在我看来,这只适用于我只有一张过期优惠券的情况……但仍然感谢Derby是否支持外键约束?外键约束已经包括在内!更改表仅供参考tial操作。@MS90外键约束不会自动添加,您可以