Перейти к основному содержимому

Практика: Основы PostgreSQL — DDL и DML


Онлайн редактор кода для PostgreSQL

Здесь вы можете попробовать свои силы в программировании на языке SQL для работы с PostgreSQL. Для этого мы предоставляем вам онлайн редактор кода, в котором вы можете написать свой код и запустить его.


❗️ При обновлении страницы код пропадёт, по этому, сохраните свой код куда-нибудь, если он важный.

Задание 1 — Простая таблица с разными ограничениями

Задание 1: Простая таблица с ограничениями

⏱️ Примерное время: 10-15 минут

Создай таблицу с PRIMARY KEY, NOT NULL, UNIQUE, DEFAULT и CHECK.


Пример полей:

  • id SERIAL PRIMARY KEY
  • name / title VARCHAR(100–150) NOT NULL
  • code / sku / isbn VARCHAR(50) UNIQUE
  • created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
  • active BOOLEAN DEFAULT TRUE

Требования:

  • минимум одно CHECK (например, price > 0, year ≥ 1900, age ≥ 18 и т.п.)
  • Вставь 3–4 записи с помощью INSERT ... VALUES
  • Попробуй вставить некорректные данные → посмотри ошибки

Задание 2 — Связь один-ко-многим (автор → книги / категория → товары)

Задание 2: Связь 1:N

⏱️ Примерное время: 15-20 минут

Создай две таблицы с FOREIGN KEY и разными ON DELETE.


Требования:

  • Родительская таблица: id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL UNIQUE
  • Дочерняя таблица: id SERIAL PRIMARY KEY, name VARCHAR(150) NOT NULL, parent_id INTEGER NOT NULL REFERENCES parent(id) ON DELETE ...
  • Выбери подходящую стратегию ON DELETE
  • Вставь 2 записи в родительскую и по 3–4 в дочернюю
  • Попробуй удалить родительскую запись → посмотри, что произошло

Пример:
DELETE FROM authors WHERE author_id = 1;
→ все книги этого автора тоже удалятся (если CASCADE)

Задание 3 — Связь многие-ко-многим (студенты ↔ курсы)

Задание 3: Связь N:N

⏱️ Примерное время: 20-25 минут

Создай связующую таблицу для отношения многие-ко-многим.


Требования:

  • Две основные таблицы: id SERIAL PK, name VARCHAR(100) NOT NULL
  • Связующая таблица: (left_id, right_id) PRIMARY KEY, FOREIGN KEY ... ON DELETE CASCADE на обе стороны
  • Опционально: дата записи, статус и т.п.
  • Вставь по 3 записи в каждую основную таблицу и 5–8 связей

Пример связующей таблицы:

CREATE TABLE student_courses (
student_id INTEGER REFERENCES students(student_id) ON DELETE CASCADE,
course_id INTEGER REFERENCES courses(course_id) ON DELETE CASCADE,
enrolled_at DATE DEFAULT CURRENT_DATE,
PRIMARY KEY (student_id, course_id)
);

Задание 4 — INSERT с RETURNING и ON CONFLICT

Задание 4: Продвинутый INSERT

⏱️ Примерное время: 15-20 минут

Используй RETURNING и ON CONFLICT.


Требования:

  • Используй RETURNING * или конкретные поля
  • Хотя бы один вариант с ON CONFLICT DO NOTHING
  • Хотя бы один с ON CONFLICT ... DO UPDATE SET ... = EXCLUDED....

Пример:

INSERT INTO products (sku, name, price)
VALUES ('ABC123', 'Телефон', 39990)
ON CONFLICT (sku)
DO UPDATE SET
price = EXCLUDED.price,
updated_at = NOW()
RETURNING product_id, name, price;

Задание 5 — ALTER TABLE: добавление и изменение полей

Задание 5: Изменение структуры таблицы

⏱️ Примерное время: 15-20 минут

Добавь поля, ограничения, измени типы.


Требования:

  • Сначала создай простую таблицу
  • Затем выполни 3–5 команд ALTER TABLE
  • После каждого ALTER используй \d для проверки

Пример:

ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users ADD CONSTRAINT unique_phone UNIQUE (phone);
ALTER TABLE users ALTER COLUMN email SET NOT NULL;

Задание 6 — Мини-проект: структура интернет-магазина

Задание 6: Полная структура мини-магазина (итоговое)

⏱️ Примерное время: 30-45 минут

Создай 4–5 таблиц с правильными связями и вставь тестовые данные.


Требования:

  • users (id, username, email, created_at)
  • categories (id, name UNIQUE)
  • products (id, name, price NUMERIC CHECK >0, category_id REFERENCES, stock INTEGER DEFAULT 0 CHECK >=0)
  • orders (id, user_id REFERENCES, created_at, status VARCHAR DEFAULT 'new' CHECK IN (...))
  • order_items (order_id, product_id, quantity CHECK >0, price_at_purchase NUMERIC)
  • Все FOREIGN KEY с подходящими ON DELETE
  • Вставь по 2–4 записи в каждую таблицу
  • Используй RETURNING хотя бы в одном INSERT

После создания используй \dt и \d для проверки структуры.

подсказка

Ошибки нарушения ограничений — твои лучшие учителя.
Читай их внимательно — они почти всегда объясняют, что именно пошло не так.