gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:46:33 25 4
gpt4 key购买 nike

我的数据库中有三个表:

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

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

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

另外,我正在使用此方法将 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();
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_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;

关于sql - 是否可以在FOREIGN KEY的子表中插入行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54066332/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com