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