我有2个表格,您将在下面的posgresql代码中看到。第一个表student有两列,一列是student_name,另一列是student_id,它是主键。在我称为测试的第二张表中,该表有4列,一列用于subject_id,一列用于subject_name,然后一列用于在该学科中具有最高分数的学生,该分数最高。我正在尝试使highestStudent_id引用我的students表中的student_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 REFERENCES students(student_id))
highestStudent_id SERIAL REFERENCES students
highestStudent_id REFERENCES students(student_id))
请问在postgresql中创建外键的正确方法是什么?
假设此表:
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 );
内联提及目标列:
( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
里面的线不对create table:
create table
( subject_id SERIAL, subject_name text, highestStudent_id integer, constraint fk_tests_students foreign key (highestStudent_id) REFERENCES students (student_id) );
作为单独的alter table声明:
alter table
( subject_id SERIAL, subject_name text, highestStudent_id integer );
alter table tests add constraint fk_tests_students foreign key (highestStudent_id) REFERENCES students (student_id);
您更喜欢哪一个取决于口味。但是您应该在脚本中保持一致。如果您有外键引用由一个以上的列组成的PK,则最后两个语句是唯一的选择- 在这种情况下,您无法定义FK“内联”foreign key (a,b) references foo (x,y)
foreign key (a,b) references foo (x,y)
如果您不喜欢Postgres系统生成的名称,则只有版本3)和4)才可以为FK约束定义自己的名称。
该serial数据类型是不是一个真正的数据类型。这只是一种简写形式,它定义了从序列中获取的列的默认值。因此,任何列 引用 规定为柱serial必须使用适当的碱类型定义integer(或bigint对于bigserial列)
serial
integer
bigint
bigserial