Раздел 33 · PostgreSQL с нуля

CREATE TABLE подробно

junior~20 мин

без входаВойди, чтобы отмечать прогресс, вести заметки и решать задачи в редакторе. войти

Типы мы разобрали в прошлом кластере, последним был урок про булев тип и приведение. Теперь собираем из них таблицы. 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 ₽.

Оплата пока не подключена: премиум и курсы открываются промокодом.