PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Typ danych Postgres ENUM czy SPRAWDŹ OGRANICZENIE?

Opierając się na komentarzach i odpowiedziach tutaj oraz niektórych elementarnych badaniach, mam następujące podsumowanie do zaoferowania dla komentarzy z Postgres-erati. Naprawdę docenię Twój wkład.

Istnieją trzy sposoby ograniczenia wpisów w kolumnie tabeli bazy danych Postgres. Rozważ tabelę do przechowywania „kolorów”, w których chcesz, aby prawidłowe wpisy były tylko „czerwony”, „zielony” lub „niebieski”.

  1. Wyliczony typ danych

    CREATE TYPE valid_colors AS ENUM ('red', 'green', 'blue');
    
    CREATE TABLE t (
        color VALID_COLORS
    );
    

    Zaletą jest to, że typ można zdefiniować raz, a następnie wykorzystać ponownie w dowolnej liczbie tabel. Standardowe zapytanie może zawierać listę wszystkich wartości typu ENUM i może być używane do tworzenia widżetów formularzy wniosku.

    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
    

    Wadą jest to, że typ ENUM jest przechowywany w katalogach systemowych, więc do wyświetlenia jego definicji wymagane jest zapytanie jak powyżej. Te wartości nie są widoczne podczas przeglądania definicji tabeli. A ponieważ typ ENUM jest w rzeczywistości typem danych odrębnym od wbudowanych typów danych NUMERIC i TEXT, zwykłe operatory i funkcje numeryczne i łańcuchowe nie działają na nim. Nie można więc wykonać zapytania takiego jak

    SELECT FROM t WHERE color LIKE 'bl%'; 
    
  2. Sprawdź ograniczenia

    CREATE TABLE t (
        colors TEXT CHECK (colors IN ('red', 'green', 'blue'))
    );
    

    Dwie zalety to to, że po pierwsze „otrzymujesz to, co widzisz”, co oznacza, że ​​prawidłowe wartości dla kolumny są zapisywane bezpośrednio w definicji tabeli, a po drugie, działają wszystkie natywne operatory łańcuchowe lub numeryczne.

  3. Klucze obce

    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)
    );
    

    Zasadniczo tak samo, jak tworzenie typu ENUM, z wyjątkiem tego, że działają natywne operatory numeryczne lub łańcuchowe i nie trzeba wyszukiwać katalogów systemowych, aby wykryć prawidłowe wartości. Połączenie jest wymagane, aby połączyć color_id do żądanej wartości tekstowej.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL:eksport danych wynikowych z zapytania SQL do Excela/CSV

  2. Dodaj dni do daty w PostgreSQL

  3. Dołącz znak plus/minus do liczby w PostgreSQL

  4. Przypadkowo usunięto domyślne uprawnienia superużytkownika postgres - czy mogę je odzyskać?

  5. Wyrównanie planetarne