MySQL外键约束多表相同字段

时间:2015-06-06 13:44:38

标签: mysql foreign-keys

我有一个评论系统,用户可以在其中评论各种不同类型的页面。每种页面类型(例如评论)都有自己的表格,其中包含GROUP BY列。在我的评论表中,我有idpage_type,它们引用了网页的类型和相应表格的page_id列。

我希望根据idpage_id列上设置外键约束,以便在页面ID更改或页面被删除时,注释将更新。我知道单列上不可能这样做,但最好的解决办法是什么呢?

我可以为每个页面类型添加一个列,该列将引用特定表中的ID并对其进行外键约束,但随着页面类型数量开始增长(目前有4个),这可能会变得混乱。

1 个答案:

答案 0 :(得分:0)

MySQL不支持派生列上的外键引用(没有派生列)。

所以,我会说,如果你需要一个外键引用某些东西,那么“某事”就是一个实体。这应该是参考的地方。考虑这样的结构:

create table pages (
    PageId int not null autoincrement primary key,
    <additional columns common to all pages>
);

然后每个特定的页面类型可以是:

create table PagesType1 (
    PageType1Id int not null autoincrement primary key,
    PageId int not null,
    foreign key PageId references pages(PageId)
)

这并不完美,因为两种不同的页面类型可以引用回同一页面。但是,没有触发器,这对MySQL来说非常好。另一种解决方案是:

create table pages (
    PageId int not null autoincrement primary key,
    <additional columns common to all pages>,
    PageType1Id int unique,
    PageType2Id int unique,
    . . .
    foreign key (PageType1Id) references PagesType1(PageType1Id),
    . . .
);

这正确地获取了外键关系。但是,您需要一个触发器来保证只设置一个值。

无论如何,这个答案的要点是你的数据库中需要一个Pages实体。有多种方法可以实现它。