我有 2 个表,您将在下面的 PosgreSQL 代码中看到。第一个表学生有 2 列,一列是主键,student_name另一列student_id是主键。
student_name
student_id
在我的第二个名为测试的表中,它有 4 列,一列用于 subject_id,一列用于subject_name,然后一列用于在科目中得分最高的学生highestStudent_id。我试图在我的学生表中highestStudent_id引用。student_id这是我下面的代码,不确定语法是否正确:
subject_id
subject_name
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 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