Dengan asumsi tabel ini:
CREATE TABLE students
(
student_id SERIAL PRIMARY KEY,
player_name TEXT
);
Ada empat cara berbeda untuk mendefinisikan kunci asing (ketika berhadapan dengan satu kolom PK) dan semuanya mengarah ke batasan kunci asing yang sama:
-
Sebaris tanpa menyebutkan kolom target:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students );
-
Sejalan dengan menyebutkan kolom target:
CREATE TABLE tests ( subject_id SERIAL, subject_name text, highestStudent_id integer REFERENCES students (student_id) );
-
Keluar dari baris di dalam
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) );
-
Sebagai
alter table
yang terpisah pernyataan: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);
Yang mana yang Anda sukai adalah masalah selera. Tetapi Anda harus konsisten dalam skrip Anda. Dua pernyataan terakhir adalah satu-satunya opsi jika Anda memiliki kunci asing yang mereferensikan PK yang terdiri dari lebih dari satu kolom - Anda tidak dapat mendefinisikan "inline" FK dalam kasus itu, mis. foreign key (a,b) references foo (x,y)
Hanya versi 3) dan 4) yang akan memberi Anda kemampuan untuk menentukan nama Anda sendiri untuk batasan FK jika Anda tidak menyukai yang dihasilkan sistem dari Postgres.
serial
tipe data sebenarnya bukan tipe data. Ini hanya notasi tangan pendek yang mendefinisikan nilai default untuk kolom yang diambil dari urutan. Jadi setiap kolom referensi kolom yang didefinisikan sebagai serial
harus didefinisikan menggunakan tipe dasar yang sesuai integer
(atau bigint
untuk bigserial
kolom)