是否可以在FOREIGN KEY的子表中插入行?

时间:2019-01-06 21:59:59

标签: sql join jdbc foreign-keys derby

我的数据库中有三个表:

search_results

公司可以创建优惠券,因此在创建优惠券时,优惠券的ID和公司ID将添加到COMPANY(ID, NAME) COUPON(ID, TITLE) COMPANY_COUPON(COMPANY_ID, COUPON_ID) 表中。公司删除优惠券时,由于COMPANY_COUPON,它也会从COUPONCOMPANY_COUPON中删除。当我删除公司时,由于FOREIGN KEY,它也从COMPANYCOMPANY_COUPON中删除了,但其所有优惠券都留在FOREIGN KEY表中,我试图添加到COUPON中表COUPON,但是由于这个原因,我无法将新优惠券插入FOREIGN KEY(ID) REFERENCES COMPANY_COUPON(COUPON_ID)表中。

将很高兴为您提供有关如何创建正确的表以及如何向现有表添加帮助的答案。 也许有些联接可以帮助解决这个问题,但是我对sql命令的了解还不强,对不起...

此外,我正在使用此方法将COUPON表中的COMPANY_IDCOUPON_ID连接起来,也许还有更好的方法。

COMPANY_COUPON

这是一个创建优惠券,我在其中使用@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();

2 个答案:

答案 0 :(得分:3)

您的数据库设计未针对您的用例进行正确规范化。侯有一对一的关系,每个公司可以有多个优惠券,每个优惠券都属于一个公司。您不需要表COMPANY_COUPON来表示该关系。正确的处理方法是在表COMPANY.ID中存储对COUPON的引用。

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;

答案 1 :(得分:1)

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