Перейти к основному содержимому
Модуль 9 · Урок 1 из 433/57 в курсе~10 min
Уроки модуля (1/4)

Расширенные типы данных и ENUM

На предыдущем уроке мы видели базовую команду CREATE TABLE. Давайте теперь рассмотрим некоторые расширенные типы данных, которые PostgreSQL предлагает для более точного и безопасного моделирования наших доменов.

Числовые и текстовые типы

PostgreSQL имеет несколько типов чисел и текста. Выбор правильного помогает как с проверкой, так и с местом для хранения.

SQL
CREATE TABLE advanced_products (
  id           SERIAL PRIMARY KEY,
  name         VARCHAR(50) NOT NULL,
  description  TEXT,
  -- NUMERIC(p,s) dove p = cifre totali, s = cifre decimali
  price        NUMERIC(10, 2) NOT NULL,
  featured     BOOLEAN DEFAULT FALSE
);
  • TEXT и VARCHAR(n): производительность в Postgres идентична. Вы используете VARCHAR(n) только тогда, когда хотите явно ограничить вставляемую длину на уровне базы данных.
  • NUMERIC(10, 2): идеально подходит для денег или арифметической точности. Здесь допускается не более 8 целых цифр и 2 десятичных знаков (всего 10). Если вы вставите 10.555, Postgres округлит его до 10.56.

Тип UUID

Для безопасных идентификаторов, представленных в Интернете (например, общедоступных идентификаторов в URL-адресах), UUID часто предпочтительнее классического приращения SERIAL.

SQL
CREATE TABLE public_orders (
  id          UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  customer    TEXT NOT NULL,
  total       NUMERIC(10, 2)
);

ENUM (перечисления)

Часто столбец должен содержать только одно из нескольких предопределенных значений (например, статус заказа: «новый», «оплачен», «отправлен»). Один из подходов — использовать ключевое слово CHECK, но PostgreSQL предлагает собственные типы ENUM.

SQL
-- Dobbiamo prima creare il tipo:
CREATE TYPE order_status AS ENUM ('nuovo', 'pagato', 'spedito', 'cancellato');

-- Ora possiamo usarlo in una tabella:
CREATE TABLE orders_demo (
  id SERIAL PRIMARY KEY,
  status order_status NOT NULL DEFAULT 'nuovo'
);

Это гарантирует, что никто никогда не сможет вставить неверный статус, обеспечивая целостность данных.

Попробуйте это

Упражнение#sql.m9.l1.e1
Попыток: 0Загрузка…

Создайте таблицу user_reviews с: идентификатором (SERIAL pk), test_id (UUID со стандартным gen_random_uuid()), оценкой (целое число, не равное нулю) и содержимым (ТЕКСТ). Ни одно из других полей не нуждается в явных ограничениях, кроме типа.

Загрузка редактора…
Показать подсказку

Напишите CREATE TABLE user_reviews (...), а затем различные поля. Помните о запятых.

Решение доступно после 3 попыток

Обзор упражнения

Упражнение#sql.m9.l1.e2
Попыток: 0Загрузка…

Сначала создайте тип ENUM «user_role» со значениями «admin» и «user». Затем создайте таблицу enum_users с идентификатором (SERIAL pk) и ролью (тип, который вы только что создали, НЕ NULL).

Загрузка редактора…
Показать подсказку

Не забывайте ; чтобы разделить два оператора (CREATE TYPE и CREATE TABLE).

Решение доступно после 3 попыток