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

Tipe data Postgres ENUM atau CHECK CONSTRAINT?

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.

  1. 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%'; 
    
  2. 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.

  3. 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Skrip shell untuk menjalankan perintah pgsql dalam file

  2. Menemukan string serupa dengan PostgreSQL dengan cepat

  3. Hibernasi dan Basis Data Multi-Penyewa menggunakan Skema di PostgreSQL

  4. Memasukkan string teks dengan hex ke dalam PostgreSQL sebagai byte

  5. Berfungsi untuk menghilangkan aksen di postgreSQL