sql >> Databasteknik >  >> RDS >> PostgreSQL

Postgres ENUM-datatyp eller CHECK CONSTRAINT?

Baserat på kommentarerna och svaren här, och en del rudimentär forskning, har jag följande sammanfattning att erbjuda för kommentarer från Postgres-erati. Kommer verkligen att uppskatta din input.

Det finns tre sätt att begränsa poster i en Postgres-databastabellkolumn. Överväg en tabell för att lagra "färger" där du bara vill att "röd", "grön" eller "blå" ska vara giltiga poster.

  1. Uppräknad datatyp

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

    Fördelar är att typen kan definieras en gång och sedan återanvändas i så många tabeller som behövs. En standardfråga kan lista alla värden för en ENUM-typ och kan användas för att göra ansökningsformulärwidgetar.

    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
    

    Nackdelarna är att ENUM-typen lagras i systemkataloger, så en fråga enligt ovan krävs för att se dess definition. Dessa värden är inte uppenbara när du visar tabelldefinitionen. Och eftersom en ENUM-typ faktiskt är en datatyp som är separat från de inbyggda NUMERIC- och TEXT-datatyperna, fungerar inte de vanliga numeriska och strängoperatorerna och funktionerna på den. Så man kan inte göra en fråga som

    SELECT FROM t WHERE color LIKE 'bl%'; 
    
  2. Kontrollera begränsningar

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

    Två fördelar är att en, "det du ser är vad du får", det vill säga de giltiga värdena för kolumnen registreras direkt i tabelldefinitionen, och två, alla inbyggda sträng- eller numeriska operatorer fungerar.

  3. Främmande nycklar

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

    I huvudsak samma sak som att skapa en ENUM-typ, förutom att de ursprungliga numeriska eller strängoperatorerna fungerar, och man behöver inte söka i systemkataloger för att upptäcka de giltiga värdena. En anslutning krävs för att länka color_id till önskat textvärde.



  1. Hur GREATEST() fungerar i MariaDB

  2. Ingen unik eller uteslutningsbegränsning som matchar ON CONFLICT

  3. Ansluter Oracle till SQL Server från Windows

  4. 2 sätt att ta bort dubbletter av rader i Oracle