Модульні уроки (1/4)
Розширені типи даних і ENUM
У попередньому уроці ми бачили базову команду CREATE TABLE. Давайте тепер дослідимо деякі розширені типи даних, які PostgreSQL пропонує для моделювання наших доменів більш точним і безпечним способом.
Числовий і текстовий типи
PostgreSQL має кілька типів для чисел і тексту. Вибір правильного допомагає як з перевіркою, так і з місцем для зберігання.
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 приростом.
CREATE TABLE public_orders (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
customer TEXT NOT NULL,
total NUMERIC(10, 2)
);ENUM (перерахування)
Часто стовпець має містити лише одне з кількох попередньо визначених значень (наприклад, статус замовлення: «новий», «оплачено», «відправлено»). Одним із підходів є використання ключового слова CHECK, але PostgreSQL пропонує власні типи ENUM.
-- 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'
);Це гарантує, що ніхто ніколи не зможе вставити недійсний статус, захищаючи послідовність даних.
Спробуйте
Створіть таблицю «user_reviews» із: id (SERIAL pk), test_id (UUID із замовчуванням gen_random_uuid()), score (integer not null) і content (TEXT). Жодне з інших полів не потребує явних обмежень, крім типу.
Показати підказку
Напишіть CREATE TABLE user_reviews (...), а потім різні поля. Запам'ятайте коми.
Рішення доступне після 3 спроб
Повторна вправа
Спочатку створіть тип ENUM 'user_role' зі значеннями 'admin' і 'user'. Потім створіть таблицю «enum_users» з ідентифікатором (SERIAL pk) і роллю (тип, який ви щойно створили, НЕ NULL).
Показати підказку
Не забувайте про ; щоб розділити два оператори (CREATE TYPE і CREATE TABLE).
Рішення доступне після 3 спроб