Berikut adalah tabel sederhana tempat catatan dapat merujuk catatan induk di tabel yang sama:
CREATE TABLE foo (
id SERIAL PRIMARY KEY,
parent_id INT NULL,
num INT NOT NULL,
txt TEXT NULL,
FOREIGN KEY (parent_id) REFERENCES foo(id)
);
Dengan persyaratan tambahan bahwa salah satu nilai bidang lainnya ( num
) harus identik antara catatan induk dan anak, saya pikir kunci asing gabungan harus melakukan trik. Saya mengubah baris terakhir menjadi
FOREIGN KEY (parent_id, num) REFERENCES foo(id, num)
dan mendapat ERROR: tidak ada batasan unik yang diberikan kunci untuk tabel referensi "foo" .
Saya dapat dengan mudah menambahkan batasan ini, tetapi saya tidak mengerti mengapa itu perlu, ketika salah satu kolom yang direferensikan ( id
) sudah dijamin unik? Cara saya melihatnya, kendala baru akan menjadi berlebihan.
NULL != NULL
. Pokoknya .. :)UNIQUE INDEX
mana kolomNULLABLE
.. itulah sebabnya saya menyebutkannya. :) Tapi saya setuju - dalam hal tidak ada NULL (dan bukan indeks parsial juga), mungkin cukup mudah.Kunci Asing secara umum (bukan hanya gabungan) HARUS menunjuk ke KUNCI semacam UNIK semacam di tabel lain. Jika tidak, tidak akan ada integritas data relasional.
Ini mengeluh karena, saat Anda memiliki kunci unik di (id) .. Anda TIDAK memiliki kunci unik di (id, num) .. Dengan demikian, sejauh menyangkut DB, pasangan (id, num) adalah tidak DIJAMIN menjadi unik. Kita, sebagai manusia, dapat mengetahuinya akan menjadi unik, tapi saya yakin akan ada banyak kode tambahan yang harus mereka tambahkan untuk membuat Postgres cukup pintar untuk melihat bahwa "oh hei .. id seharusnya unik , jadi id, num juga harus unik "..
Saya akan sangat terkejut jika mereka menambahkan kode itu ketika yang harus Anda lakukan adalah membuat indeks unik pada dua kolom untuk memperbaiki masalah.
Untuk lebih jelasnya, kode yang mereka harus tambahkan tidak akan hanya kasus sederhana ini ... itu harus menangani semua kasus, bahkan yang mana kunci asing ada di 4+ kolom, dll. Saya yakin Logikanya akan sangat kompleks.
sumber