0Pricing
SQL Academy · Урок

Значения DEFAULT и генерируемые столбцы

Задавайте DEFAULT (NOW(), uuid_generate_v4(), 'pending') и вычисляйте значения на лету с помощью столбцов GENERATED ALWAYS AS

«Значения DEFAULT и генерируемые столбцы» — бесплатный урок SQL Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

DEFAULT: автоматическое заполнение пропущенных значений

Если INSERT не указывает столбец, используется DEFAULT:

CREATE TABLE users (
  id BIGSERIAL PRIMARY KEY,
  email VARCHAR(255) NOT NULL,
  status TEXT NOT NULL DEFAULT 'active',
  created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

Распространённые DEFAULT

Шаблоны, которые пригодятся повсюду:

created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
id UUID PRIMARY KEY DEFAULT gen_random_uuid()
is_active BOOLEAN NOT NULL DEFAULT true
status TEXT NOT NULL DEFAULT 'pending'

Добавление DEFAULT позже

Существующие строки по умолчанию не заполняются заново — DEFAULT используется только для новых вставок:

ALTER TABLE users ALTER COLUMN status SET DEFAULT 'active';

-- For existing rows, backfill manually:
UPDATE users SET status = 'active' WHERE status IS NULL;

Добавление NOT NULL с DEFAULT

PostgreSQL 11+ поддерживает быстрое добавление столбцов NOT NULL с постоянным DEFAULT — таблица при этом не переписывается:

ALTER TABLE users
  ADD COLUMN signup_source TEXT NOT NULL DEFAULT 'web';
-- Fast in PG 11+, slow before

Вычисляемые сгенерированные столбцы (STORED)

Столбец, значение которого автоматически вычисляется на основе других столбцов:

CREATE TABLE orders (
  id BIGSERIAL PRIMARY KEY,
  qty INT NOT NULL,
  unit_price NUMERIC(10,2) NOT NULL,
  total NUMERIC(12,2) GENERATED ALWAYS AS (qty * unit_price) STORED
);

INSERT INTO orders (qty, unit_price) VALUES (3, 9.99);
SELECT * FROM orders;       -- total is auto-filled

Сгенерированный вектор для полнотекстового поиска

Отличный способ использовать сгенерированные столбцы STORED:

ALTER TABLE articles
  ADD COLUMN search_doc tsvector
    GENERATED ALWAYS AS (to_tsvector('english', title || ' ' || body)) STORED;
CREATE INDEX articles_search_idx ON articles USING GIN(search_doc);

Виртуальные сгенерированные столбцы

Сегодня PostgreSQL поддерживает только STORED (виртуальные столбцы появятся в будущих версиях). Другие базы данных (MySQL) поддерживают столбцы VIRTUAL, которые вычисляются во время SELECT.

В столбцы, созданные автоматически, нельзя выполнять INSERT

Попытка записать значение в такой столбец приводит к ошибке — эти значения вычисляются, а не сохраняются вами:

INSERT INTO orders (qty, unit_price, total) VALUES (3, 9.99, 30);
-- ERROR: column "total" can only be updated to DEFAULT

Значения DEFAULT на основе последовательности

SERIAL/BIGSERIAL — это сокращённая запись для «DEFAULT из последовательности»:

-- Roughly equivalent:
CREATE TABLE t (id BIGSERIAL PRIMARY KEY);

-- =>
CREATE SEQUENCE t_id_seq;
CREATE TABLE t (id BIGINT PRIMARY KEY DEFAULT nextval('t_id_seq'));
ALTER SEQUENCE t_id_seq OWNED BY t.id;

Столбцы IDENTITY

Стандартный способ SQL определить идентичность:

CREATE TABLE t (
  id BIGINT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
  name TEXT
);

-- GENERATED BY DEFAULT AS IDENTITY allows explicit overrides.

DEFAULT и бизнес-логика

Делайте DEFAULT простым. Сложную логику размещайте в коде приложения или в триггере BEFORE INSERT.

Итоги

DEFAULT заполняет пропуски, а GENERATED вычисляет значение на основе других столбцов.

  • NOW(), gen_random_uuid(), константные литералы
  • Вычисляемые столбцы STORED отлично подходят для производных данных
  • Столбцы идентичности — современный шаблон для PK

Проверка знаний

Какая конструкция автоматически заполняет столбец текущим временем при выполнении INSERT, если значение не указано?

Часто задаваемые вопросы

Урок «Значения DEFAULT и генерируемые столбцы» бесплатный?

Да — полный текст урока «Значения DEFAULT и генерируемые столбцы» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Значения DEFAULT и генерируемые столбцы»?

Задавайте DEFAULT (NOW(), uuid_generate_v4(), 'pending') и вычисляйте значения на лету с помощью столбцов GENERATED ALWAYS AS Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.

Сколько времени занимает урок «Значения DEFAULT и генерируемые столбцы»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Ограничения NOT NULL и CHECK
  2. Ограничения UNIQUE и составные ключи
  3. FOREIGN KEY и ссылочные действия
  4. Значения DEFAULT и генерируемые столбцы
← Назад к SQL Academy