Na základě zde uvedených komentářů a odpovědí a některých základních výzkumů vám mohu nabídnout následující shrnutí pro komentáře z Postgres-erati. Opravdu oceníme váš příspěvek.
Existují tři způsoby, jak omezit položky ve sloupci tabulky databáze Postgres. Zvažte tabulku pro uložení "barvy", kde chcete, aby byly platnými položkami pouze 'červená', 'zelená' nebo 'modrá'.
-
Výčtový datový typ
CREATE TYPE valid_colors AS ENUM ('red', 'green', 'blue'); CREATE TABLE t ( color VALID_COLORS );
Výhodou je, že typ lze definovat jednou a poté jej znovu použít v libovolném počtu tabulek. Standardní dotaz může vypsat všechny hodnoty pro typ ENUM a lze jej použít k vytvoření widgetů formuláře aplikace.
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
Nevýhody jsou, že typ ENUM je uložen v systémových katalozích, takže pro zobrazení jeho definice je vyžadován dotaz jako výše. Tyto hodnoty nejsou patrné při prohlížení definice tabulky. A protože typ ENUM je ve skutečnosti datovým typem odděleným od vestavěných datových typů NUMERIC a TEXT, běžné číselné a řetězcové operátory a funkce na něm nefungují. Nelze tedy provést dotaz jako
SELECT FROM t WHERE color LIKE 'bl%';
-
Zkontrolujte omezení
CREATE TABLE t ( colors TEXT CHECK (colors IN ('red', 'green', 'blue')) );
Dvě výhody spočívají v tom, že zaprvé „co vidíte, to dostanete“, to znamená, že platné hodnoty pro sloupec jsou zaznamenány přímo v definici tabulky, a zadruhé fungují všechny nativní řetězcové nebo číselné operátory.
-
Cizí klíče
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) );
V podstatě totéž jako při vytváření typu ENUM, s tím rozdílem, že fungují nativní číselné nebo řetězcové operátory a člověk se nemusí dotazovat na systémové katalogy, aby zjistil platné hodnoty. K propojení
color_id
je vyžadováno spojení na požadovanou textovou hodnotu.