Karena PRIMARY KEY
membuat kolom yang disertakan NOT NULL
secara otomatis . Saya mengutip manualnya di sini:
Batasan kunci utama menentukan bahwa kolom atau kolom tabel hanya dapat berisi nilai unik (non-duplikat), bukan nol. Secara teknis,
PRIMARY KEY
hanyalah kombinasi dariUNIQUE
danNOT NULL
.
Penekanan saya yang berani.
Saya menjalankan tes untuk mengonfirmasi bahwa NOT NULL
benar-benar berlebihan dalam kombinasi dengan PRIMARY KEY
kendala (dalam implementasi saat ini, diuji ulang di versi 13). NOT NULL
kendala tetap bahkan setelah menghilangkan batasan PK, terlepas dari NOT NULL
explicit eksplisit klausa pada waktu pembuatan.
CREATE TABLE foo (foo_id int PRIMARY KEY);
ALTER TABLE foo DROP CONSTRAINT foo_pkey;
db=# \d foo
table »public.foo«
column | type | attribute
--------+---------+-----------
foo_id | integer | not null -- stays
db<>main biola di sini
Perilaku yang sama jika NULL
termasuk dalam CREATE TABLE
pernyataan.
Tetap tidak ada salahnya untuk menjaga NOT NULL
berlebihan dalam repositori kode jika kolom seharusnya NOT NULL
. Jika nanti Anda memutuskan untuk mengubah batasan PK, Anda mungkin lupa menandai kolom NOT NULL
- atau apakah itu seharusnya NOT NULL
.
Ada item di wiki Postgres TODO untuk memisahkan NOT NULL
dari kendala PK. Jadi ini mungkin berubah di versi mendatang:
Pindahkan informasi batasan NOT NULL ke pg_constraint
Saat ini batasan NOT NULL disimpan di pg_attribute tanpa penunjukan asalnya, mis. kunci utama. Salah satu masalah nyata adalah bahwa menjatuhkan batasan PRIMARY KEY tidak menghapus penunjukan batasan NOT NULL. Masalah lain adalah bahwa kita mungkin harus memaksa NOT NULL untuk disebarkan dari tabel induk ke anak-anak, seperti halnya batasan CHECK. (Tetapi apakah menjatuhkan KUNCI UTAMA memengaruhi anak-anak?)
Jawaban untuk pertanyaan tambahan
Bukankah lebih baik jika CREATE TABLE yang saling bertentangan ini gagal begitu saja?
Seperti yang dijelaskan di atas, ini
foo_id INTEGER NULL PRIMARY KEY
adalah (saat ini) 100% setara dengan:
foo_id INTEGER PRIMARY KEY
Sejak NULL
diperlakukan sebagai kata kebisingan dalam konteks ini.
Dan kami tidak ingin yang terakhir gagal. Jadi ini bukan pilihan.