Въз основа на коментарите и отговорите тук и някои елементарни изследвания, имам следното резюме, което да предложа за коментари от Postgres-erati. Наистина ще оценя вашия принос.
Има три начина за ограничаване на записи в колона на таблица на база данни на Postgres. Помислете за таблица за съхраняване на „цветове“, където искате само „червено“, „зелено“ или „синьо“ да бъдат валидни записи.
-
Изброен тип данни
CREATE TYPE valid_colors AS ENUM ('red', 'green', 'blue'); CREATE TABLE t ( color VALID_COLORS );
Предимствата са, че типът може да бъде дефиниран веднъж и след това да се използва повторно в толкова таблици, колкото е необходимо. Стандартна заявка може да изброи всички стойности за тип ENUM и може да се използва за създаване на приспособления за формуляри за кандидатстване.
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
Недостатъците са, че типът ENUM се съхранява в системни каталози, така че е необходима заявка, както е по-горе, за да видите дефиницията му. Тези стойности не са очевидни при преглед на дефиницията на таблицата. И тъй като типът ENUM всъщност е тип данни, отделен от вградените типове данни NUMERIC и TEXT, обикновените числови и низови оператори и функции не работят върху него. Така че не може да се направи заявка като
SELECT FROM t WHERE color LIKE 'bl%';
-
Проверете ограниченията
CREATE TABLE t ( colors TEXT CHECK (colors IN ('red', 'green', 'blue')) );
Две предимства са, че едно, „това, което виждате, е това, което получавате“, тоест валидните стойности за колоната се записват точно в дефиницията на таблицата, и второ, всички естествени низови или числови оператори работят.
-
Външни ключове
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) );
По същество същото като създаването на тип ENUM, с изключение на това, че собствените числови или низови оператори работят и не е необходимо да се правят заявки към системни каталози, за да се открият валидните стойности. За свързване на
color_id
е необходимо присъединяване до желаната текстова стойност.