mysql - 相互依赖的外键

时间:2012-01-24 17:08:21

标签: mysql database-design foreign-keys

我正在尝试创建一个数据库,它有两个具有相互依赖的外键的表。

第一个表格被称为问题,它包含有关用户提出的问题的数据,还需要保留关键字以获得在问题上回答的最佳答案。 (这应该是我们的第二个名为Answer的表的外键)

第二个表称为答案,它包含有关问题答案的信息,还需要持有一个question_id字段,这是该答案所回答的问题的关键。 这也是第一个表的外键。

当我尝试创建表时,它无法创建第一个表,因为它不知道第二个表(当我们尝试将外键声明到第二个表时尚不存在时出错)

以下是我正在使用的代码:

create table question
( q_id              numeric(10,0),  
  best_a_id         numeric(10,0),
 primary key(q_id),
 foreign key (best_a_id) references answer(a_id),
); 


create table answer
( a_id              numeric(10,0),
  q_id              numeric(10,0) not null,
 primary key(a_id),
 foreign key (q_id) references question(q_id),
);

我如何解决这个问题? 感谢

3 个答案:

答案 0 :(得分:5)

创建没有外键约束的第一个表。然后按原样创建第二个表。最后,返回并更改第一个表,单独添加外键约束。

添加外键的SQL将如下所示:

ALTER TABLE question
ADD FOREIGN KEY (best_a_id)
REFERENCES answer(a_id);

只是好奇,但为什么要保持两个表中的问答关系?因为(正如ypercube指出的那样)当你第一次提出问题时,你没有“最佳答案”,但你的设计需要它。在答案表中维持这种关系可能更好,类似于Olivier的建议。

答案 1 :(得分:5)

考虑摆脱question.best_a_id,而是添加best_answers表:

create table best_answers
( q_id              numeric(10,0),  
  best_a_id         numeric(10,0),
 primary key(q_id),
 foreign key (best_a_id, q_id) references answer(a_id, q_id)
);

如果您对特定问题(可能是平局)有多个最佳答案,请将best_a_id列添加到主键。

答案 2 :(得分:3)

在答案表中添加一个标志。

create table answer 
( a_id              numeric(10,0), 
  q_id              numeric(10,0) not null, 
  best_answer       numeric(1) default 0 not null,
 primary key(a_id), 
 foreign key (q_id) references question(q_id), 
); 

从问题表中删除best_a_id