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;