Eu tenho 2 tabelas, como você verá no meu código posgresql abaixo. A primeira tabela de alunos possui 2 colunas, uma para student_name e a outra student_id, que é a chave primária. Na minha segunda tabela chamada testes, ela possui 4 colunas, uma para subject_id, uma para o subject_name e, em seguida, uma para um aluno com a pontuação mais alta em uma disciplina com o maiorStudent_id. estou tentando fazer com que o maximumStudent_id se refira a student_id na minha tabela de alunos. Este é o código que tenho abaixo, não tenho certeza se a sintaxe está correta:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
player_name TEXT);
CREATE TABLE tests ( subject_id SERIAL,
subject_name,
highestStudent_id SERIAL REFERENCES students);
a sintaxe está highestStudent_id SERIAL REFERENCES students
correta? porque eu vi outro comohighestStudent_id REFERENCES students(student_id))
Qual seria a maneira correta de criar a chave estrangeira no postgresql, por favor?
serial
deve ser definida comointeger
.serial
não é um tipo de dados "real", é uma mão curta para preencher o valor padrão da sequênciaRespostas:
Assumindo esta tabela:
Existem quatro maneiras diferentes de definir uma chave estrangeira (ao lidar com uma única coluna PK) e todas elas levam à mesma restrição de chave estrangeira:
Inline sem mencionar a coluna de destino:
De acordo com a menção da coluna de destino:
Fora de linha dentro de
create table
:Como uma
alter table
declaração separada :Qual você prefere é uma questão de gosto. Mas você deve ser consistente em seus scripts. As duas últimas instruções são a única opção se você tiver chaves estrangeiras que referenciam uma PK que consiste em mais de uma coluna - não é possível definir a FK "inline" nesse caso, por exemplo,
foreign key (a,b) references foo (x,y)
Somente as versões 3) e 4) permitem definir seu próprio nome para a restrição FK se você não gostar dos nomes gerados pelo sistema no Postgres.
O
serial
tipo de dados não é realmente um tipo de dados. É apenas uma notação curta que define um valor padrão para a coluna retirada de uma sequência. Portanto, qualquer coluna que faça referência a uma coluna definida comoserial
deve ser definida usando o tipo de base apropriadointeger
(oubigint
parabigserial
colunas)fonte