У меня есть 2 таблицы, как вы увидите в моем коде posgresql ниже. В первой таблице student есть 2 столбца: один для student_name, а другой 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, пожалуйста?
serial
его следует определять какinteger
.serial
не является «реальным» типом данных, это сокращение дляОтветы:
Предполагая эту таблицу:
Существует четыре различных способа определения внешнего ключа (при работе с PK с одним столбцом), и все они приводят к одному и тому же ограничению внешнего ключа:
Встроенный без упоминания целевого столбца:
В строке с упоминанием целевого столбца:
Вне линии внутри
create table
:Отдельным
alter table
заявлением:Какой из них вы предпочтете - дело вкуса. Но вы должны быть последовательны в своих сценариях. Последние два оператора - единственный вариант, если у вас есть внешние ключи, ссылающиеся на PK, который состоит из более чем одного столбца - вы не можете определить FK «встроенный» в этом случае, например
foreign key (a,b) references foo (x,y)
Только версии 3) и 4) дадут вам возможность определить собственное имя для ограничения FK, если вам не нравятся сгенерированные системой из Postgres.
Тип
serial
данных на самом деле не является типом данных. Это всего лишь сокращенная запись, определяющая значение по умолчанию для столбца, взятого из последовательности. Таким образом, любой столбец, ссылающийся на столбец, определенный как,serial
должен быть определен с использованием соответствующего базового типаinteger
(илиbigint
дляbigserial
столбцов)источник