通过外键约束加强关系?

Dav*_*dia 2 sql postgresql database-design many-to-many foreign-keys

假设我有以下表格:

问题,选择,答案

每个问题都有很多选择(选择具有question_id外键。)

Answers表具有两个外键question_idchoice_id,并且这些约束可以防止引用不存在的question或的答案choice,但我也想防止无效的选择。

我如何表达一个约束(也许不是正确的词),该约束仅允许答案choice_id是给定的有效选择question_id?例如,如果我有2个问题,每个问题有2个选择:

  • Q1(ID = 1)
    • A(id = 1)
    • B(id = 2)
  • 第2季(id = 2)
    • C(id = 3)
    • D(id = 4)

我想允许像(question_id= 1,choice_id= 1(或2))之类的答案并阻止像(question_id= 1,choice_id= 4)之类的答案,因为这不是问题的有效选择。

Erw*_*ter 6

您所需要做的就是从answer到的FK约束choice - choice指向该行的行以返回相应的一个问题。

如果您坚持要answer.question_id多余的一列(在某些情况下这很有意义)仍然只有跨越多列的单个列FK约束。这要求首先UNIQUE在表上匹配多列(或PK)约束choice(否则通常也多余):

ALTER TABLE choice ADD CONSTRAINT choice_uni UNIQUE (question_id, choice_id);
Run Code Online (Sandbox Code Playgroud)

然后:

ALTER TABLE answer ADD constraint answer_choice_fkey
FOREIGN KEY (question_id, choice_id)  REFERENCES choice(question_id, choice_id);
Run Code Online (Sandbox Code Playgroud)

所有涉及的列都是,NOT NULL或者您可能需要做更多:在这种情况下,首先要了解外键约束的不同匹配类型:

有关: