J'ai 2 tables comme vous le verrez dans mon code posgresql ci-dessous. La première table Students a 2 colonnes, une pour student_name et l'autre student_id qui est la clé primaire. Dans mon deuxième tableau appelé tests, il contient 4 colonnes, une pour subject_id, une pour subject_name, puis une pour un étudiant avec le score le plus élevé dans un sujet qui est le plus élevéStudent_id. J'essaie de faire en sorte que le plus hautStudent_id fasse référence à student_id dans ma table des étudiants. C'est le code que j'ai ci-dessous, je ne suis pas sûr que la syntaxe soit correcte:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
player_name TEXT);
CREATE TABLE tests ( subject_id SERIAL,
subject_name,
highestStudent_id SERIAL REFERENCES students);
la syntaxe est-elle highestStudent_id SERIAL REFERENCES students
correcte? parce que j'en ai vu un autre commehighestStudent_id REFERENCES students(student_id))
Quelle serait la bonne façon de créer la clé étrangère dans postgresql s'il vous plaît?
serial
elle le devraitinteger
.serial
n'est pas un type de données «réel», c'est un raccourci pourRéponses:
En supposant ce tableau:
Il existe quatre manières différentes de définir une clé étrangère (lorsqu'il s'agit d'une seule colonne PK) et elles conduisent toutes à la même contrainte de clé étrangère:
Inline sans mentionner la colonne cible:
En ligne avec la mention de la colonne cible:
Hors ligne à l'intérieur du
create table
:En tant que
alter table
déclaration distincte :Celui que vous préférez est une question de goût. Mais vous devez être cohérent dans vos scripts. Les deux dernières instructions sont la seule option si vous avez des clés étrangères référençant un PK qui se compose de plus d'une colonne - vous ne pouvez pas définir le FK "en ligne" dans ce cas, par exemple
foreign key (a,b) references foo (x,y)
Seules les versions 3) et 4) vous donneront la possibilité de définir votre propre nom pour la contrainte FK si vous n'aimez pas les contraintes générées par le système depuis Postgres.
Le
serial
type de données n'est pas vraiment un type de données. C'est juste une notation abrégée qui définit une valeur par défaut pour la colonne extraite d'une séquence. Ainsi, toute colonne référençant une colonne définie commeserial
doit être définie à l'aide du type de base appropriéinteger
(oubigint
pour lesbigserial
colonnes)la source