栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

在SQL中,两个表相互引用是否可以?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

在SQL中,两个表相互引用是否可以?

不,那不行。表之间的循环引用是混乱的。请参阅这篇(已有十年的历史)文章:SQL By
Design:循环参考

一些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

这将要求

UNIQUE
在表
products_pictures
on上有一个约束/索引,
(product_id, id)
以定义上述FK并正常工作。


另一种方法是

Default_Picture_ID
product
表中删除列,然后在表中添加一
IsDefaultBIT
picture
。该解决方案的问题在于,如何仅允许每个产品使用一张图片,而其他产品禁用该图片。在SQL
Server(我认为在Postgres)中,可以使用部分索引来完成:

CREATE UNIQUE INDEX is_DefaultPicture   ON products_pictures (Product_ID)  WHERe IsDefault = 1 ;

但是MySQL没有这种功能。


第三种方法,甚至可以将两个FK列都定义为

NOTNULL
使用可延期约束。这适用于PostgreSQL,我认为适用于Oracle。通过@Erwin检查此问题和答案:SQLAlchemy中的复杂外键约束( 所有键列NOT NULL 部分)。

MySQL中的约束不能被延迟。


第四种方法(我认为最干净)是删除该

Default_Picture_ID
列并添加另一个表。FK约束中没有循环路径,并且所有FK列都将
NOTNULL
使用此解决方案:

product_default_picture----------------------product_id          NOT NULLdefault_picture_id  NOT NULLPRIMARY KEY (product_id)FOREIGN KEY (product_id, default_picture_id)  REFERENCES products_pictures (product_id, id)

这也将需要

UNIQUE
在表约束/索引
products_pictures
(product_id, id)
在溶液中1。


总而言之,对于MySQL,您有两种选择:

  • 选项1(可为空的FK列),并进行了上述更正以正确实施完整性

  • 选项4(没有可为空的FK列)



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/405187.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号