是否可以将行插入到 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
,它也会从 COUPON
和 COMPANY_COUPON
中删除。当我删除公司时,由于 FOREIGN KEY
,它也从 COMPANY
和 COMPANY_COUPON
中删除,但它的所有优惠券都留在 COUPON
table,我试图添加到 COUPON
table FOREIGN KEY(ID) REFERENCES COMPANY_COUPON(COUPON_ID)
,但因此我无法将新优惠券插入 COUPON
table.
很乐意回答如何创建正确的 tables 以及如何添加有助于现有 tables 的内容。
也许一些连接可以帮助它,我真的不擅长 sql 命令,抱歉...
此外,我正在使用此方法在 COMPANY_COUPON
table 中加入 COMPANY_ID
和 COUPON_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;
我的数据库中有三个 table:
COMPANY(ID, NAME)
COUPON(ID, TITLE)
COMPANY_COUPON(COMPANY_ID, COUPON_ID)
公司可以创建优惠券,所以在创建优惠券时,优惠券的ID和公司的ID将被添加到COMPANY_COUPON
table。当公司删除优惠券时,由于 FOREIGN KEY
,它也会从 COUPON
和 COMPANY_COUPON
中删除。当我删除公司时,由于 FOREIGN KEY
,它也从 COMPANY
和 COMPANY_COUPON
中删除,但它的所有优惠券都留在 COUPON
table,我试图添加到 COUPON
table FOREIGN KEY(ID) REFERENCES COMPANY_COUPON(COUPON_ID)
,但因此我无法将新优惠券插入 COUPON
table.
很乐意回答如何创建正确的 tables 以及如何添加有助于现有 tables 的内容。 也许一些连接可以帮助它,我真的不擅长 sql 命令,抱歉...
此外,我正在使用此方法在 COMPANY_COUPON
table 中加入 COMPANY_ID
和 COUPON_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;