首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按条件从一列到两列的不同表的外键

问按条件从一列到两列的不同表的外键
EN

Stack Overflow用户
提问于 2013-06-17 01:23:43
回答 2查看 1.8K关注 0票数 0

我有树表MySQL:

文章表包含:

代码语言:javascript
复制
id int
title varchar(255)
...

新闻表包含:

代码语言:javascript
复制
id int
title varchar(255)
...

备注表格包含:

代码语言:javascript
复制
id int
content text
type tinyint(1)  //this column holds 0 if this comment for news and holds 1 for article
fid  int         // this column holds id of article or news 

如何使外键从评论表到文章和新闻。我的意思是如何在MySQL查询中实现这一点:

代码语言:javascript
复制
if type=0 then
 FOREIGN KEY (fid) REFERENCES news(id)

if type=1 then
 FOREIGN KEY (fid) REFERENCES articles(id)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-17 01:53:08

为了建立正确的PK-FK关系,我建议使用一个超集表(让我们称之为posts)。在这种情况下,您的模式可能如下所示

代码语言:javascript
复制
CREATE TABLE posts 
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  type TINYINT(1)
);

CREATE TABLE articles
(
  id INT NOT NULL,
  title VARCHAR (255),
  article_property VARCHAR(128),
  -- other article specific attributes
  CONSTRAINT FOREIGN KEY (id) REFERENCES posts (id)
);

CREATE TABLE news
(
  id INT NOT NULL,
  title VARCHAR (255),
  reporter VARCHAR(128),
  -- other news specific attributes
  CONSTRAINT FOREIGN KEY (id) REFERENCES posts (id)
);

CREATE TABLE comments
(
  id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
  post_id INT NOT NULL,
  content TEXT,
  CONSTRAINT FOREIGN KEY (post_id) REFERENCES posts (id)  
);

要在插入新文章和新闻时填充id,可以使用触发器

代码语言:javascript
复制
DELIMITER $$
CREATE TRIGGER tg_article_insert 
BEFORE INSERT ON articles
FOR EACH ROW
BEGIN
  INSERT INTO posts (type) VALUES (1);
  SET NEW.id = LAST_INSERT_ID();
END$$

CREATE TRIGGER tg_news_insert 
BEFORE INSERT ON news
FOR EACH ROW
BEGIN
  INSERT INTO posts (type) VALUES (0);
  SET NEW.id = LAST_INSERT_ID();
END$$
DELIMITER ;

这是演示。

票数 1
EN

Stack Overflow用户

发布于 2013-06-17 01:53:45

您可以阅读有关外键约束here的内容,您将注意到只允许一个表。

一种解决方法是对单独的is使用单独的列:

代码语言:javascript
复制
id int
content text
type tinyint(1)   //this column holds 0 if this comment for news and holds 1 for article
articleid  int
newsid int
. . . 
foreign key (articleid) references articles(id)
foreign key (newsid) references news(id)

实际上,您可以省去type,并添加一个约束(由触发器实现),即在任何给定时间只能填充一个id。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17135877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档