Подтвердить что ты не робот

Синтаксис внешнего ключа postgresql

У меня есть 2 таблицы, как вы увидите в моем postgresql-коде ниже. У первых учеников таблицы есть 2 столбца, один для имени студента, а другой student_id - первичный ключ. В моей второй таблице, называемой тестами, у этого есть 4 столбца, один для subject_id, один для subject_name, затем один для студента с самым высоким счетом в субъекте, который является самым высокимStudent_id. Я пытаюсь сделать highStudent_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, пожалуйста?

4b9b3361

Ответ 1

Предполагая эту таблицу:

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);
    

Какой из них вы предпочитаете, это вопрос вкуса. Но вы должны быть последовательны в своих сценариях. Последние два утверждения являются единственной опцией, если у вас есть внешние ключи, ссылающиеся на PK, который состоит из более чем одного столбца - вы не можете определить FK "inline" в этом случае, например. foreign key (a,b) references foo (x,y)

Только версии 3) и 4) даст вам возможность определить собственное имя для ограничения FK, если вам не нравятся созданные системой из Postgres.


Тип данных serial не является типом данных. Это всего лишь короткая нотация, определяющая значение по умолчанию для столбца, взятого из последовательности. Поэтому любой столбец, ссылающийся на столбец, определяемый как serial, должен быть определен с использованием соответствующего базового типа integer (или bigint для столбцов bigserial)