oracle设置禁用外键,oracle禁用表外键

不,那不行。表之间的循环引用是混乱的。请参阅这篇(已有十年的历史)文章: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_pictureson上有一个约束/索引,(product_id, id)以定义上述FK并正常工作。

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

CREATE UNIQUE INDEX is_DefaultPicture ON products_pictures (Product_ID) WHERE IsDefault = 1 ; 但是MySQL没有这种功能。

第三种方法,甚至可以将两个FK列都定义为NOT NULL使用可延期约束。这适用于PostgreSQL,我认为适用于Oracle。通过@Erwin检查此问题和答案:SQLAlchemy中的复杂外键约束(所有键列NOT NULL部分)。

MySQL中的约束不能被延迟。

第四种方法(我认为最干净)是删除该Default_Picture_ID列并添加另一个表。FK约束中没有循环路径,并且所有FK列都将NOT 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) 这也将需要UNIQUE在表约束/索引products_pictures对(product_id, id)在溶液中1。

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

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

选项4(没有可为空的FK列)来源:stack overflow

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值