Типы мы разобрали в прошлом кластере, последним был урок про булев тип и приведение. Теперь собираем из них таблицы. CREATE TABLE мы уже писали в четвёртом уроке, но тогда это была заготовка на четыре колонки. Сегодня разбираем команду целиком: что база заполнит сама, что обязано прийти от тебя и как удалить таблицу, когда она больше не нужна.
Бланк анкеты
Вспомни бумажную анкету в поликлинике. У каждой графы есть название и формат: «Дата рождения: ..____». Некоторые графы помечены звёздочкой, без них анкету не примут. В других уже напечатан ответ, например «Гражданство: РФ», и его зачёркивают, только если он не подходит.
Таблица в PostgreSQL устроена так же:
| В анкете | В таблице |
|---|---|
| название графы | имя колонки |
| формат «..____» | тип данных |
| звёздочка «обязательно» | NOT NULL |
| заранее напечатанный ответ | DEFAULT |
CREATE TABLE печатает бланк. Строки, которые потом вставляет INSERT, это заполненные анкеты.
Полная команда
Таблица книг магазина:
CREATE TABLE books (
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
title text NOT NULL,
price numeric(8, 2),
in_stock boolean NOT NULL DEFAULT true,
added_on date NOT NULL DEFAULT current_date
);
Разберём по колонкам:
idнумерует база, это identity из шестого урока.PRIMARY KEYделает его ключом таблицы, подробно о ключах в следующем уроке.titleобязателен: книга без названия не книга.priceможет быть пустым. Цену новинки иногда ещё не знают, иNULLздесь честно значит «пока неизвестно».in_stockобязателен, но если его не передать, база подставитtrue.added_onтоже заполнится сам: функцияcurrent_dateвернёт сегодняшнюю дату.
Колонки перечисляются через запятую, после последней запятой нет. Выравнивать типы по столбцу необязательно, но так таблицу читать легче.
Имена пиши маленькими буквами через подчёркивание. Помнишь ловушку с регистром? Ещё одна ловушка: зарезервированные слова. Таблицу заказов хочется назвать order, но это слово из ORDER BY:
CREATE TABLE order (id integer);
ERROR: syntax error at or near "order"
Назови таблицу orders, и вопрос исчезнет. Так же не годятся user, table, group.
Значение по умолчанию
Значение по умолчанию срабатывает, когда колонки нет в списке INSERT:
INSERT INTO books (title, price) VALUES ('Шинель', 250.00);
SELECT * FROM books;
id | title | price | in_stock | added_on
----+--------+--------+----------+------------
1 | Шинель | 250.00 | t | 2026-10-09
(1 row)
id, in_stock и added_on мы не передавали, база заполнила их сама. У тебя дата будет сегодняшней.
Если колонка в списке есть, а значение хочется оставить базе, пиши слово DEFAULT вместо значения:
INSERT INTO books (title, price, in_stock) VALUES ('Нос', NULL, DEFAULT);
Важная тонкость: DEFAULT подставляется, только когда значения нет. Явный NULL это тоже значение, и умолчание его не заменит.
урок из курса
Урок из курса «PostgreSQL с нуля». Курс покупается один раз и остаётся навсегда: 500 ₽.
Оплата пока не подключена: премиум и курсы открываются промокодом.