postgresql 外键语法
postgresql foreign key syntax
我有 2 个 table,您将在下面的 posgresql 代码中看到。第一个 table 学生有 2 列,一列用于 student_name,另一列用于 student_id,这是主键。
在我的第二个 table 调用测试中,它有 4 列,一列用于 subject_id,一列用于 subject_name,然后一列用于科目中得分最高的学生 [=23] =].我试图让 highestStudent_id 在我的学生 table 中引用 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))
请问在 postgresql 中创建外键的正确方法是什么?
假设这个 table:
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_id)
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_id)
REFERENCES students (student_id);
你喜欢哪一个是品味问题。但是你应该在你的脚本中保持一致。如果您有外键引用由多个列组成的 PK,则最后两个语句是唯一的选择 - 在这种情况下,您不能定义 FK "inline",例如foreign key (a,b) references foo (x,y)
如果您不喜欢系统从 Postgres 生成的名称,则只有版本 3) 和 4) 可以让您为 FK 约束定义您自己的名称。
serial
数据类型并不是真正的数据类型。它只是一种简写符号,用于定义从序列中获取的列的默认值。因此,任何列 引用 定义为 serial
的列都必须使用适当的基本类型 integer
(或 bigint
用于 bigserial
列来定义)
我有 2 个 table,您将在下面的 posgresql 代码中看到。第一个 table 学生有 2 列,一列用于 student_name,另一列用于 student_id,这是主键。 在我的第二个 table 调用测试中,它有 4 列,一列用于 subject_id,一列用于 subject_name,然后一列用于科目中得分最高的学生 [=23] =].我试图让 highestStudent_id 在我的学生 table 中引用 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))
请问在 postgresql 中创建外键的正确方法是什么?
假设这个 table:
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_id) 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_id) REFERENCES students (student_id);
你喜欢哪一个是品味问题。但是你应该在你的脚本中保持一致。如果您有外键引用由多个列组成的 PK,则最后两个语句是唯一的选择 - 在这种情况下,您不能定义 FK "inline",例如foreign key (a,b) references foo (x,y)
如果您不喜欢系统从 Postgres 生成的名称,则只有版本 3) 和 4) 可以让您为 FK 约束定义您自己的名称。
serial
数据类型并不是真正的数据类型。它只是一种简写符号,用于定义从序列中获取的列的默认值。因此,任何列 引用 定义为 serial
的列都必须使用适当的基本类型 integer
(或 bigint
用于 bigserial
列来定义)