小编典典

PostgreSQL 外键语法

all

我有 2 个表,您将在下面的 PosgreSQL 代码中看到。第一个表学生有 2
列,一列是主键,student_name另一列student_id是主键。

在我的第二个名为测试的表中,它有 4 列,一列用于
subject_id,一列用于subject_name,然后一列用于在科目中得分最高的学生highestStudent_id。我试图在我的学生表中highestStudent_id引用。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中创建外键的正确方法是什么?


阅读 65

收藏
2022-08-17

共1个答案

小编典典

假设这张表:

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_id)
    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_id)
    REFERENCES students (student_id);

你更喜欢哪一个是品味问题。但是你应该在你的脚本中保持一致。如果您有外键引用包含多于一列的 PK,则最后两个语句是唯一的选择 - 在这种情况下,您不能定义
FK“内联”,例如foreign key (a,b) references foo (x,y)

如果您不喜欢系统从 Postgres 生成的名称,只有版本 3) 和 4) 可以让您为 FK 约束定义自己的名称。


serial数据类型并不是真正的数据类型。它只是一个简写符号,它定义了从序列中获取的列的默认值。因此,任何 引用
定义为的列的列都serial必须使用适当的基本类型integer(或bigint对于bigserial列)进行定义

2022-08-17