PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Тип данни на Postgres ENUM или ПРОВЕРКА НА ОГРАНИЧЕНИЕТО?

Въз основа на коментарите и отговорите тук и някои елементарни изследвания, имам следното резюме, което да предложа за коментари от Postgres-erati. Наистина ще оценя вашия принос.

Има три начина за ограничаване на записи в колона на таблица на база данни на Postgres. Помислете за таблица за съхраняване на „цветове“, където искате само „червено“, „зелено“ или „синьо“ да бъдат валидни записи.

  1. Изброен тип данни

    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%'; 
    
  2. Проверете ограниченията

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

    Две предимства са, че едно, „това, което виждате, е това, което получавате“, тоест валидните стойности за колоната се записват точно в дефиницията на таблицата, и второ, всички естествени низови или числови оператори работят.

  3. Външни ключове

    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 е необходимо присъединяване до желаната текстова стойност.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвам Postgres JSONB тип данни с JPA?

  2. Как да предотвратим изтриването на първия ред в таблицата (PostgreSQL)?

  3. Архивиране и възстановяване на PostgreSQL 9.0

  4. Колона не съществува?

  5. INSERT a SELECT GROUP BY :повече целеви колони, отколкото изрази грешка