不,不行表之间的循环引用是凌乱的。看到这个(十岁)的文章:
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列)