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