PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Mengapa saya bisa membuat tabel dengan PRIMARY KEY pada kolom nullable?

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 dari UNIQUE dan NOT 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana saya bisa mendapatkan dump database postgres teks biasa di heroku?

  2. Bagaimana date_trunc() Bekerja di PostgreSQL

  3. Tambahkan Hari ke Tanggal di PostgreSQL

  4. Cara Menggunakan Fungsi Substring di PostgreSQL dan Redshift

  5. Mengelola Ketersediaan Tinggi PostgreSQL – Bagian I:Kegagalan Otomatis PostgreSQL