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时),它们都导致相同的外键约束:
-
内联不提目标列:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
内联提及目标栏:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
在
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) );
-
作为一个单独的
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
列)定义,