sql >> Databáze >  >> RDS >> PostgreSQL

Datový typ Postgres ENUM nebo CHECK CONSTRAINT?

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á'.

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

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



  1. Oracle sql:pořadí podle a odlišné klauzule

  2. předání názvu tabulky jako parametru plsql

  3. SQL Server Database Backup Encryption

  4. Jak získat údaje o prodeji za poslední 3 měsíce v MySQL