Saya memiliki 2 tabel seperti yang akan Anda lihat di kode posgresql saya di bawah ini. Siswa tabel pertama memiliki 2 kolom, satu untuk student_name dan student_id lainnya yang merupakan primary key. Dalam tabel kedua saya yang disebut tes, ini memiliki 4 kolom, satu untuk subject_id, satu untuk subject_name, kemudian satu untuk siswa dengan skor tertinggi dalam subjek yang merupakan nilai_tertinggi. Saya mencoba membuat latestStudent_id merujuk ke student_id di tabel siswa saya. Ini adalah kode yang saya miliki di bawah ini, saya tidak yakin apakah sintaksnya benar:
CREATE TABLE students ( student_id SERIAL PRIMARY KEY,
player_name TEXT);
CREATE TABLE tests ( subject_id SERIAL,
subject_name,
highestStudent_id SERIAL REFERENCES students);
apakah sintaksnya highestStudent_id SERIAL REFERENCES students
benar? karena saya telah melihat yang lain sepertihighestStudent_id REFERENCES students(student_id))
Apa cara yang benar untuk membuat kunci asing di postgresql?
serial
mestinyainteger
.serial
bukan tipe data "nyata", ini adalah cara singkat untuk mengisi nilai default dari urutanJawaban:
Dengan asumsi tabel ini:
Ada empat cara berbeda untuk mendefinisikan kunci asing (saat menangani satu kolom PK) dan semuanya mengarah ke batasan kunci asing yang sama:
Sebaris tanpa menyebutkan kolom target:
Sejalan dengan menyebutkan kolom target:
Keluar dari baris di dalam
create table
:Sebagai
alter table
pernyataan terpisah :Yang mana yang Anda sukai adalah soal selera. Tetapi Anda harus konsisten dalam skrip Anda. Dua pernyataan terakhir adalah satu-satunya pilihan jika Anda memiliki kunci asing yang mereferensikan PK yang terdiri dari lebih dari satu kolom - Anda tidak dapat mendefinisikan FK "sebaris" dalam kasus itu, misalnya
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 sistem yang dihasilkan dari Postgres.
The
serial
tipe data tidak benar-benar tipe data. Itu hanya notasi tangan pendek yang mendefinisikan nilai default untuk kolom yang diambil dari sebuah urutan. Jadi setiap kolom yang mereferensikan kolom yang ditentukanserial
harus ditentukan menggunakan tipe dasar yang sesuaiinteger
(ataubigint
untukbigserial
kolom)sumber