mysql引用表的两种方式_mysql – 在SQL中,两个表可以相互引用吗?

不,不行表之间的循环引用是凌乱的。看到这个(十岁)的文章:

SQL By Design: The Circular Reference

有些DBMS可以处理这些,特别注意的是,但是MySQL会有问题。

第一个选择是,作为您的设计,使两个FK之一成为无效。这样可以解决鸡蛋问题(我应该先插入哪个表格?)。

尽管你的代码有一个问题。它将允许产品具有默认图片,该图片将引用另一个产品!

要禁止这样的错误,您的FK约束应该是:

CONSTRAINT FK_products_1

FOREIGN KEY (id, default_picture_id)

REFERENCES products_pictures (product_id, id)

ON DELETE RESTRICT --- the SET NULL options would

ON UPDATE RESTRICT --- lead to other issues

这将需要在上表FK的(product_id,id)的表products_pictures中定义UNIQUE约束/索引并正常工作。

另一种方法是从产品表中删除Default_Picture_ID列,并在图表中添加IsDefault BIT列。该解决方案的问题是如何让每个产品只有一张照片才能让所有其他照片都有效。在SQL Server中(我认为在Postgres中)可以使用部分索引:

CREATE UNIQUE INDEX is_DefaultPicture

ON products_pictures (Product_ID)

WHERE IsDefault = 1 ;

但MySQL没有这样的功能。

第三种方法允许您将两个FK列定义为NOT NULL都是使用可延迟的约束。这在PostgreSQL中有用,我认为在Oracle中。检查这个问题和@Erwin的答案:Complex foreign key constraint in SQLAlchemy(所有关键列NOT NULL部分)。

MySQL中的限制不能延迟。

第四种方法(我发现最干净)是删除Default_Picture_ID列并添加另一个表。 FK约束中没有循循环径,并且所有FK列将不会为此解决方案为NULL:

product_default_picture

----------------------

product_id NOT NULL

default_picture_id NOT NULL

PRIMARY KEY (product_id)

FOREIGN KEY (product_id, default_picture_id)

REFERENCES products_pictures (product_id, id)

这也将需要在解决方案1中的product_id图中的product_id中的UNIQUE约束/索引。

总而言之,使用MySQL有两个选项:

>选项1(可空的FK列)与上面的更正来强制完整性的完整性>选项4(无可空FK列)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值