PostgreSQL:约束,只有在另一个表中存在时才在列中插入值

时间:2009-04-11 03:01:49

标签: postgresql

我想为我的表学生添加一个约束,以便在其主要列中输入的任何值也必须存在于majors表中。我怎么能这样做?

1 个答案:

答案 0 :(得分:5)

这是一个外键约束。

ALTER TABLE student 
 ADD CONSTRAINT somename 
 FOREIGN KEY (major_id) REFERENCES major (id);

请注意,如果student.major_id可以为空,则列的值仍可为null。

另请注意,您的表格不适合双重专业。为此,我们有一个student_major表,它是学生和专业之间的多对多关系。这还演示了如何在create table中创建外键,而不是在alter table中创建外键

create table student_major (
 id serial not null unique primary key,           -- optional, but good idea
 student_id int not null references student(id),  -- fk 
 major_id int not null references major(id),      -- fk
 UNIQUE (student_id, major_id)                    -- no redundant relations
);

注释:

  

-1表示拒绝复合键。 - 比尔卡文

让我明白这一点。比尔同意我正确回答了OP关于约束的问题。他同意我正确地看到OP没有询问的内容,可能是双重专业。但比尔仍然认为这个答案是错误的,因为比尔和我不同意复合键。

我甚至没有说合成身份证是必要的;事实上,我特别说它是可选但在我看来是个好主意。 (为什么?使用删除,使用可能引用student_majors的表,以及通常使用ORMS和生成的代码的“表现更好”。)

比尔,坦率地说这很小。你在详细阐述(复合/合成)上详细说明了一个正确的答案(学生:主要是M:M而不是M:1),以及什么是“宗教”战争。您是否标记了正确的答案,因为您不同意应答者 vs。空格或vi vs。 emacs上的回答者的立场?也许你应该花时间给出自己的答案,而不是标出正确答案。