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