Значения 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 — локальная установка не требуется.
Все уроки этого курса
- Ограничения NOT NULL и CHECK
- Ограничения UNIQUE и составные ключи
- FOREIGN KEY и ссылочные действия
- Значения DEFAULT и генерируемые столбцы