postgresql外键语法

我有两个表,你会看到我的posgresql代码下面。 第一个表的学生有两列,一个是student_name,另一个是主键student_id。 在我的第二个名为tests的表中,它有4列,一个用于subject_id,一个用于subject_name,然后一个用于学生最高评分最高的学生。 我试图让我的学生表中的student_id指向highestStudent_id。 这是我下面的代码,不知道如果语法是正确的:

CREATE TABLE students ( student_id SERIAL PRIMARY KEY, player_name TEXT); CREATE TABLE tests ( subject_id SERIAL, subject_name, highestStudent_id SERIAL REFERENCES students); 

highestStudent_id SERIAL REFERENCES students是否正确地使用了最highestStudent_id SERIAL REFERENCES students ? 因为我看过另一个像highestStudent_id REFERENCES students(student_id))

请问在postgresql中创build外键的正确方法是什么?

假设这张表:

 CREATE TABLE students ( student_id SERIAL PRIMARY KEY, player_name TEXT ); 

有四种不同的方式来定义一个外键(当处理一个单列PK时),它们都导致相同的外键约束:

  1. 内联不提目标列:

     CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students ); 
  2. 内联提及目标栏:

     CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) ); 
  3. create table内不符合的地方:

     CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer, constraint fk_tests_students foreign key (highestStudent) REFERENCES students (student_id) ); 
  4. 作为一个单独的alter table语句:

     CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer ); alter table tests add constraint fk_tests_students foreign key (highestStudent) REFERENCES students (student_id); 

你喜欢哪一个是品味的问题。 但是你的脚本应该是一致的。 最后两个语句是唯一的select,如果你有外键引用一个由多个列组成的PK – 你不能在这种情况下定义FK“内联”,例如foreign key (a,b) references foo (x,y)

只有版本3)和4)才能让你能够为FK约束定义自己的名字,如果你不喜欢从Postgres生成的。


serial数据types不是真正的数据types。 这只是一个简短的符号,它为从一个序列中取出的列定义了一个默认值。 所以引用定义为serial的列的任何列必须使用适当的基本typesinteger (或bigint for bigserial列)定义,