sql >> Database teknologi >  >> RDS >> PostgreSQL

Postgres ENUM datatype eller CHECK CONSTRAINT?

Baseret på kommentarerne og svarene her, og nogle rudimentære undersøgelser, har jeg følgende resumé at tilbyde til kommentarer fra Postgres-erati. Vil virkelig sætte pris på dit input.

Der er tre måder at begrænse indtastninger i en Postgres-databasetabelkolonne. Overvej en tabel til at gemme "farver", hvor du kun ønsker "rød", "grøn" eller "blå" for at være gyldige poster.

  1. Opregnet datatype

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

    Fordele er, at typen kan defineres én gang og derefter genbruges i så mange tabeller som nødvendigt. En standardforespørgsel kan angive alle værdierne for en ENUM-type og kan bruges til at lave ansøgningsformular-widgets.

    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
    

    Ulemperne er, at ENUM-typen er gemt i systemkataloger, så en forespørgsel som ovenfor er påkrævet for at se dens definition. Disse værdier er ikke synlige, når du ser tabeldefinitionen. Og da en ENUM-type faktisk er en datatype adskilt fra de indbyggede NUMERIC- og TEXT-datatyper, fungerer de almindelige numeriske og streng-operatorer og -funktioner ikke på den. Så man kan ikke lave en forespørgsel som

    SELECT FROM t WHERE color LIKE 'bl%'; 
    
  2. Tjek begrænsninger

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

    To fordele er, at en, "det du ser er, hvad du får", det vil sige, at de gyldige værdier for kolonnen registreres lige i tabeldefinitionen, og to, alle indbyggede strenge eller numeriske operatorer fungerer.

  3. Fremmednøgler

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

    Grundlæggende det samme som at oprette en ENUM-type, bortset fra at de oprindelige numeriske eller strengoperatorer virker, og man behøver ikke at forespørge i systemkataloger for at finde de gyldige værdier. En joinforbindelse er påkrævet for at linke color_id til den ønskede tekstværdi.



  1. Trin for trin opgraderingsproces for R12.2 Upgrade Part -1

  2. Oprettelse af dynamisk pivottabel med funktionen QUOTENAME

  3. Kom godt i gang med PostgreSQL 11 på Ubuntu 18.04

  4. Bulk Insert til Oracle ved hjælp af .NET