我正在尝试创建一个数据库,它有两个具有相互依赖的外键的表。
第一个表格被称为问题,它包含有关用户提出的问题的数据,还需要保留关键字以获得在问题上回答的最佳答案。 (这应该是我们的第二个名为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),
);
我如何解决这个问题? 感谢
答案 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
。