Перейти до основного вмісту
Модуль 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» із: id (SERIAL pk), test_id (UUID із замовчуванням gen_random_uuid()), score (integer not null) і content (TEXT). Жодне з інших полів не потребує явних обмежень, крім типу.

Завантаження редактора…
Показати підказку

Напишіть 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 спроб