CREATE TABLE подробно

Учимся создавать таблицы осознанно: столбцы, типы, значения по умолчанию и порядок объявления.

CREATE TABLE — команда, определяющая структуру новой таблицы: имена столбцов, их типы и правила, которым обязаны подчиняться данные.

Анатомия CREATE TABLE

Каждый столбец описывается тремя частями: имя, тип и (необязательно) ограничения. Рассмотрим переносимый пример — его можно запустить.

CREATE TABLE customers (
    id      INTEGER PRIMARY KEY,
    name    TEXT NOT NULL,
    city    TEXT DEFAULT 'Москва',
    active  INTEGER DEFAULT 1
);

INSERT INTO customers (id, name) VALUES (1, 'Анна');
INSERT INTO customers (id, name, city) VALUES (2, 'Борис', 'Казань');

SELECT * FROM customers;

Вывод:

1|Анна|Москва|1
2|Борис|Казань|1

Обратите внимание на Анну: мы не указали ни city, ни active, и база подставила значения по умолчанию — 'Москва' и 1. Это и есть смысл DEFAULT: разумное значение, когда явного нет.

Значения по умолчанию

DEFAULT может быть не только константой, но и выражением или вызовом функции. Это особенно полезно для меток времени.

CREATE TABLE posts (
    id         SERIAL PRIMARY KEY,
    title      TEXT NOT NULL,
    views      INTEGER DEFAULT 0,
    created_at TIMESTAMPTZ DEFAULT now()   -- момент вставки подставится сам
);

Теперь при каждой вставке created_at автоматически получит текущий момент, а views начнётся с нуля — об этом не нужно думать в коде приложения.

Временные таблицы

Иногда нужна таблица «на время сессии» — для промежуточных расчётов. Такая таблица исчезнет, когда вы отключитесь.

CREATE TEMPORARY TABLE tmp_report (
    category TEXT,
    total    NUMERIC
);
-- живёт только до конца сессии, потом удаляется автоматически

Удаление и пересоздание

Таблицу удаляют командой DROP TABLE. Очень частая защита от ошибки «таблица не существует» — модификатор IF EXISTS.

DROP TABLE posts;              -- удалить таблицу и все её данные
DROP TABLE IF EXISTS posts;    -- удалить, но не падать, если её нет

-- Удалить ВСЕ строки, но оставить структуру (быстрее, чем DELETE):
TRUNCATE TABLE posts;
КомандаЧто делает
DROP TABLEудаляет таблицу целиком (структуру и данные)
TRUNCATEбыстро удаляет все строки, структура остаётся
DELETE FROMудаляет строки по условию (можно с WHERE)

Итог

  • Столбец = имя + тип + (опционально) ограничения; порядок столбцов задаёте вы.
  • DEFAULT подставляет значение, когда явного нет; может быть выражением, например now().
  • DROP TABLE [IF EXISTS] удаляет таблицу; TRUNCATE быстро очищает её, сохраняя структуру.
Проверьте себя
1. Что произойдёт при вставке строки, если для столбца с DEFAULT не передать значение?
AВставка завершится ошибкой
BВ столбец запишется значение по умолчанию
CВ столбец запишется NULL независимо от DEFAULT
DСтрока не вставится
2. Чем TRUNCATE отличается от DROP TABLE?
AНичем
BTRUNCATE удаляет все строки, но оставляет структуру таблицы; DROP удаляет таблицу целиком
CTRUNCATE удаляет только одну строку
DDROP сохраняет данные
3. Зачем к DROP TABLE добавляют IF EXISTS?
AЧтобы удалить быстрее
BЧтобы команда не падала с ошибкой, если таблицы нет
CЧтобы сохранить данные
DЧтобы создать таблицу
Поддержать проект