Sql 是否可以将行插入到外键的子表中?

Sql 是否可以将行插入到外键的子表中?,sql,join,jdbc,foreign-keys,derby,Sql,Join,Jdbc,Foreign Keys,Derby,我的数据库中有三个表: COMPANY(ID, NAME) COUPON(ID, TITLE) COMPANY_COUPON(COMPANY_ID, COUPON_ID) 公司可以创建优惠券,所以在创建优惠券时,优惠券的ID和公司的ID将添加到公司的优惠券表中。当公司删除优惠券时,由于外键的原因,它也将从优惠券和公司优惠券中删除。当我删除公司时,由于外键,它也从公司和公司优惠券中删除,但其所有优惠券都保留在优惠券表中,我尝试将外键ID引用公司优惠券优惠券优惠券ID添加到优惠券表中,但由

我的数据库中有三个表:

COMPANY(ID, NAME)  
COUPON(ID, TITLE)  
COMPANY_COUPON(COMPANY_ID, COUPON_ID)
公司可以创建优惠券,所以在创建优惠券时,优惠券的ID和公司的ID将添加到公司的优惠券表中。当公司删除优惠券时,由于外键的原因,它也将从优惠券和公司优惠券中删除。当我删除公司时,由于外键,它也从公司和公司优惠券中删除,但其所有优惠券都保留在优惠券表中,我尝试将外键ID引用公司优惠券优惠券优惠券ID添加到优惠券表中,但由于它,我无法将新优惠券插入优惠券表

对于如何创建正确的表以及如何添加有助于现有表的内容的答案,我将非常高兴。 也许一些连接可以帮上忙,我在sql命令方面还不是很强,对不起

另外,我用这个方法将COMPANY_ID和优惠券ID连接到COMPANY_优惠券表中,也许有更好的方法

@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


你建立的是一种多对多关系:一家公司可以有许多优惠券,但优惠券也可以属于许多公司。这就是为什么在删除公司时,级联删除会删除联接表COMPANY\u优惠券中的条目,但它不会删除优惠券中的任何行,因为这些行也可能与其他公司相关。如果优惠券只能属于一家公司,那么您需要一对多关系:在优惠券中放置一个company\u id外键列,并去掉联接表。

您设置的是多对多关系:一家公司可以有多个优惠券,但优惠券也可以属于多家公司。这就是为什么在删除公司时,级联删除会删除联接表COMPANY\u优惠券中的条目,但它不会删除优惠券中的任何行,因为这些行也可能与其他公司相关。如果优惠券只能属于一家公司,那么您需要一对多的关系:在优惠券中放置一个company\u id外键列,并去掉联接表。

您的数据库设计没有针对您的用例进行适当的规范化。Hou有一个1对N的关系,每个公司可以有多个优惠券,每个优惠券属于一个公司。你不需要表格公司的优惠券来代表这种关系。正确的方法是在优惠券表中存储对COMPANY.ID的引用


您的数据库设计没有针对您的用例进行适当的规范化。Hou有一个1对N的关系,每个公司可以有多个优惠券,每个优惠券属于一个公司。你不需要表格公司的优惠券来代表这种关系。正确的方法是在优惠券表中存储对COMPANY.ID的引用


餐桌公司优惠券有什么意义?如果每张优惠券都属于一家公司,只需在优惠券表中存储对company.ID的引用。是的,每张优惠券都属于一家公司,您能解释一下如何操作吗?或者您的意思是只向包含公司ID的优惠券表中添加新字段?表COMPANY\u优惠券有什么意义?如果每张优惠券都属于一家公司,只需在优惠券表中存储对company.ID的引用。是的,每张优惠券都属于一家公司,您能解释一下如何操作吗?或者您的意思是向包含公司ID的优惠券表中添加新字段?实际上,它是标准化的,只是针对业务模型的标准化不正确。@GMB工作得很好,非常感谢!你能解释一下它们是什么:默认值0、约束和fk_?那么我如何才能在create tables second alert中添加这个呢?@VladimirKraykin有大量描述mysql外键的文档:try或@GMB如果没有先检查过的话,我不会问,但有时简单地理解某人的世界比理解学术文献语言更容易。但我不坚持,我真的很感谢你回答我,因为这对我有帮助。事实上,它是标准化的,只是商业模式的标准化不正确。@GMB工作得很好,非常感谢!你能解释一下它们是什么:默认值0、约束和fk_?那么我如何才能在create tables second alert中添加这个呢?@VladimirKraykin有大量描述mysql外键的文档:try或@GMB如果没有先检查过的话,我不会问,但有时简单地理解某人的世界比理解学术文献语言更容易。但我不坚持,我真的很感谢你回答我,因为这对我有帮助。
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.");
    }
}
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;