Berdasarkan komentar dan jawaban di sini, dan beberapa penelitian dasar, saya memiliki ringkasan berikut untuk menawarkan komentar dari Postgres-erati. Akan sangat menghargai masukan Anda.
Ada tiga cara untuk membatasi entri dalam kolom tabel database Postgres. Pertimbangkan tabel untuk menyimpan "warna" di mana Anda hanya ingin entri 'merah', 'hijau', atau 'biru' saja yang valid.
-
Tipe data enumerasi
CREATE TYPE valid_colors AS ENUM ('red', 'green', 'blue'); CREATE TABLE t ( color VALID_COLORS );
Keuntungannya adalah tipe dapat didefinisikan sekali dan kemudian digunakan kembali dalam tabel sebanyak yang diperlukan. Kueri standar dapat mencantumkan semua nilai untuk jenis ENUM, dan dapat digunakan untuk membuat widget formulir aplikasi.
SELECT n.nspname AS enum_schema, t.typname AS enum_name, e.enumlabel AS enum_value FROM pg_type t JOIN pg_enum e ON t.oid = e.enumtypid JOIN pg_catalog.pg_namespace n ON n.oid = t.typnamespace WHERE t.typname = 'valid_colors' enum_schema | enum_name | enum_value -------------+---------------+------------ public | valid_colors | red public | valid_colors | green public | valid_colors | blue
Kekurangannya, tipe ENUM disimpan dalam katalog sistem, sehingga diperlukan query seperti di atas untuk melihat definisinya. Nilai-nilai ini tidak terlihat saat melihat definisi tabel. Dan, karena tipe ENUM sebenarnya adalah tipe data yang terpisah dari tipe data NUMERIC dan TEXT bawaan, operator dan fungsi numerik dan string biasa tidak bekerja di dalamnya. Jadi, seseorang tidak dapat melakukan kueri seperti
SELECT FROM t WHERE color LIKE 'bl%';
-
Periksa batasan
CREATE TABLE t ( colors TEXT CHECK (colors IN ('red', 'green', 'blue')) );
Dua keuntungannya adalah, satu, "apa yang Anda lihat adalah apa yang Anda dapatkan", yaitu, nilai valid untuk kolom dicatat tepat di definisi tabel, dan dua, semua operator string atau numerik asli berfungsi.
-
Kunci asing
CREATE TABLE valid_colors ( id SERIAL PRIMARY KEY NOT NULL, color TEXT ); INSERT INTO valid_colors (color) VALUES ('red'), ('green'), ('blue'); CREATE TABLE t ( color_id INTEGER REFERENCES valid_colors (id) );
Pada dasarnya sama dengan membuat tipe ENUM, kecuali, operator numerik atau string asli berfungsi, dan seseorang tidak perlu meminta katalog sistem untuk menemukan nilai yang valid. Gabung diperlukan untuk menautkan
color_id
ke nilai teks yang diinginkan.