是否可以将行插入到 FOREIGN KEY 的子 table 中?

Is it possible to insert row into the child table of FOREIGN KEY?

我的数据库中有三个 table:

COMPANY(ID, NAME)  
COUPON(ID, TITLE)  
COMPANY_COUPON(COMPANY_ID, COUPON_ID)

公司可以创建优惠券,所以在创建优惠券时,优惠券的ID和公司的ID将被添加到COMPANY_COUPON table。当公司删除优惠券时,由于 FOREIGN KEY,它也会从 COUPONCOMPANY_COUPON 中删除。当我删除公司时,由于 FOREIGN KEY,它也从 COMPANYCOMPANY_COUPON 中删除,但它的所有优惠券都留在 COUPON table,我试图添加到 COUPON table FOREIGN KEY(ID) REFERENCES COMPANY_COUPON(COUPON_ID),但因此我无法将新优惠券插入 COUPON table.

很乐意回答如何创建正确的 tables 以及如何添加有助于现有 tables 的内容。 也许一些连接可以帮助它,我真的不擅长 sql 命令,抱歉...

此外,我正在使用此方法在 COMPANY_COUPON table 中加入 COMPANY_IDCOUPON_ID,也许有更好的方法。

@Override
public void linkCompanyCoupon(long companyID, long couponID) throws CouponSystemException {

    Connection connection = pool.getConnection();

    String CREATE_COUPON = "INSERT INTO COMPANY_COUPON (COMPANY_ID, COUPON_ID) VALUES (?,?)";

    try (PreparedStatement pstmt = connection.prepareStatement(CREATE_COUPON)) {
        pstmt.setLong(1, companyID);
        pstmt.setLong(2, couponID);
        pstmt.executeUpdate();
    } catch (SQLException e) {
        throw new CouponSystemException("Linking company to the coupon is failed. ", e);
    } finally {
        pool.returnConnection(connection);
    }
}

这个是创建优惠券的,里面我用的是linkCompanyCoupon();

public void createCoupon(Coupon coupon) throws CouponSystemException {

    // Checking if name of the new coupon is not duplicate
    Optional<Coupon> isCouponTitleDuplicate = Optional.ofNullable(couponDBDAO.getCouponByTitle(coupon.getTitle()));

    if (!isCouponTitleDuplicate.isPresent()) {

        couponDBDAO.createCoupon(coupon);

        companyDBDAO.linkCompanyCoupon(loggedCompany, couponDBDAO.getCouponByTitle(coupon.getTitle()).getId());

    } else {
        throw new CouponSystemException("Coupon title: " + coupon.getTitle()
                + " already exists in database, titles and IDs of the coupons must be unique.");
    }
}

你设置的是多对多的关系:一个公司可以有很多张优惠券,一张优惠券也可以属于很多公司。这就是为什么当您删除 COMPANY 时,级联删除会删除联接 table (COMPANY_COUPON) 中的条目,但不会删除 COUPON 中的任何行,因为这些行也可能与其他公司相关。如果优惠券只能属于一家公司,那么您需要一对多的关系:在优惠券中放置一个 company_id 外键列并删除连接 table.

您的数据库设计未针对您的用例进行适当规范化。 Hou 有一个 1 对 N 的关系,每个公司可以有多个优惠券,每个优惠券属于一个公司。您不需要 table COMPANY_COUPON 来表示该关系。正确的处理方法是在 table COUPON.

中存储对 COMPANY.ID 的引用
ALTER TABLE coupon 
    ADD company_id INT NOT NULL DEFAULT 0;
ALTER TABLE coupon
    ADD CONSTRAINT fk_company_id FOREIGN KEY (company_id) 
    REFERENCES company(id)
    ON DELETE CASCADE;