开发者社区> 问答> 正文

MySQL-条件外键约束

comments我的应用程序中有下表:

comments

id INT foreign_id INT model TEXT comment_text TEXT ... 这张表的想法是存储我应用程序各个部分的注释-它可以存储博客文章的注释,即:

1|34|blogpost|lorem ipsum... 用户图片:

2|12|picture|lorem ipsum... 等等。

现在,是否有一种方法可以对此类数据强制使用FOREIGN KEY约束?

即在注释表中是这样的:

FOREIGN KEY (foreign_id) REFERENCES blogposts (id) -- but only when model='blogpost'

展开
收起
保持可爱mmm 2020-05-11 13:39:31 363 0
1 条回答
写回答
取消 提交回答
  • 您正在尝试进行一种称为“ 多态关联”的设计。即,外键可以引用几个相关表中的任何表中的行。

    但是外键约束必须精确地引用一个表。您不能根据表的另一列中的值来声明引用不同表的外键Comments。这将违反关系数据库设计的一些规则。

    更好的解决方案是使注释引用某种“超表”。

    CREATE TABLE Commentable ( id SERIAL PRIMARY KEY );

    CREATE TABLE Comments ( comment_id SERIAL PRIMARY KEY, foreign_id INT NOT NULL, ... FOREIGN KEY (foreign_id) REFERENCES Commentable(id) ); 您的每种内容类型都将被视为此超表的子类型。这类似于接口的面向对象的概念。

    CREATE TABLE BlogPosts ( blogpost_id INT PRIMARY KEY, -- notice this is not auto-generated ... FOREIGN KEY (blogpost_id) REFERENCES Commentable(id) );

    CREATE TABLE UserPictures ( userpicture_id INT PRIMARY KEY, -- notice this is not auto-generated ... FOREIGN KEY (userpicture_id) REFERENCES Commentable(id) ); 必须先插入新行才能生成新的伪密钥ID ,然后才能在BlogPosts或中UserPictures插入行Commentable。然后,您可以在将内容插入到相应的子类型表中时使用该生成的ID。

    一旦完成所有这些操作,就可以依靠引用完整性约束。来源:stack overflow

    2020-05-11 13:39:45
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
搭建电商项目架构连接MySQL 立即下载
搭建4层电商项目架构,实战连接MySQL 立即下载
PolarDB MySQL引擎重磅功能及产品能力盛大发布 立即下载

相关镜像