В SQL значение по умолчанию позволяет автоматически присваивать полю конкретное значение при создании новой строки, если для этого поля явно не указано другое. Это особенно полезно для повышения целостности данных и снижения количества ошибок при вставке. Правильная настройка DEFAULT помогает упростить код клиентских приложений и обеспечивает предсказуемость поведения базы данных.
Для задания значения по умолчанию используется ключевое слово DEFAULT в момент создания или изменения таблицы. Например, чтобы установить текущую дату для поля created_at, применяется выражение created_at DATE DEFAULT CURRENT_DATE
. В случае числовых полей типичными значениями могут быть 0
или 1
– например, для поля is_active или status.
Изменение уже существующей таблицы требует явного указания значения через оператор ALTER TABLE
. Например: ALTER TABLE users ALTER COLUMN is_verified SET DEFAULT false
. Это действие не влияет на уже существующие записи, а применяется только к новым. Чтобы обновить старые строки, нужно выполнять отдельный UPDATE
.
Следует учитывать ограничения разных СУБД. В PostgreSQL можно использовать выражения и функции, такие как now()
или uuid_generate_v4()
, в качестве значений по умолчанию. В MySQL поддержка функций в DEFAULT ограничена, особенно в версиях ниже 8.0. В SQL Server допустимо использование GETDATE()
или NEWID()
, но только через CONSTRAINT
.
Как указать значение по умолчанию при создании таблицы
Для задания значения по умолчанию при создании таблицы используется конструкция DEFAULT
в определении столбца. Она позволяет задать значение, которое будет автоматически подставляться, если при вставке строки значение этого столбца не указано.
Пример для PostgreSQL:
CREATE TABLE сотрудники (
id SERIAL PRIMARY KEY,
имя TEXT NOT NULL,
статус TEXT DEFAULT 'активен',
дата_добавления TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
Значение по умолчанию может быть как фиксированной строкой или числом, так и функцией. Например, CURRENT_TIMESTAMP
задаёт текущую дату и время, а uuid_generate_v4()
(при наличии расширения uuid-ossp) – уникальный UUID.
В MySQL синтаксис аналогичен:
CREATE TABLE заказы (
id INT AUTO_INCREMENT PRIMARY KEY,
статус VARCHAR(20) DEFAULT 'в обработке',
создан TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
В SQL Server для задания значения по умолчанию используется DEFAULT
или ограничение CONSTRAINT
:
CREATE TABLE товары (
id INT IDENTITY PRIMARY KEY,
название NVARCHAR(100),
в_наличии BIT DEFAULT 1,
дата_добавления DATETIME DEFAULT GETDATE()
);
Значения по умолчанию применяются только при отсутствии переданных данных. Если передано NULL
– значение по умолчанию не используется, если столбец допускает NULL
.
Важно: изменение значения по умолчанию для существующего столбца требует команды ALTER TABLE
с указанием SET DEFAULT
. Это не влияет на уже существующие строки.
Как добавить значение по умолчанию в уже существующую таблицу
Чтобы установить значение по умолчанию для столбца в уже существующей таблице, используется оператор ALTER TABLE
с ключевым словом SET DEFAULT
. Это позволяет задать значение, которое будет автоматически присваиваться столбцу при вставке новых строк, если для него не указано иное.
- Синтаксис для установки значения по умолчанию:
ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца SET DEFAULT значение;
- Пример для числового столбца:
ALTER TABLE orders ALTER COLUMN status SET DEFAULT 0;
- Пример для текстового поля:
ALTER TABLE users ALTER COLUMN country SET DEFAULT 'Russia';
Если необходимо удалить значение по умолчанию:
ALTER TABLE имя_таблицы ALTER COLUMN имя_столбца DROP DEFAULT;
- Перед изменением проверь наличие ограничений и триггеров, которые могут зависеть от столбца.
- При работе с PostgreSQL учитывай, что новое значение по умолчанию не влияет на существующие строки.
- Для массового обновления уже добавленных записей используй отдельный
UPDATE
:
UPDATE имя_таблицы SET имя_столбца = значение WHERE имя_столбца IS NULL;
В MySQL и других СУБД синтаксис может немного отличаться. Например, в MySQL необходимо использовать MODIFY
или ALTER COLUMN
в зависимости от версии:
ALTER TABLE products MODIFY price DECIMAL(10,2) DEFAULT 0.00;
Рекомендуется проверять совместимость SQL-запросов с версией СУБД, особенно при использовании специфических типов данных или дополнительных параметров столбцов.
Как изменить значение по умолчанию для столбца
Изменить значение по умолчанию можно с помощью оператора ALTER TABLE
и конструкции ALTER COLUMN ... SET DEFAULT
. Это действие влияет только на будущие вставки строк, где значение для данного столбца явно не указано.
Пример для PostgreSQL:
ALTER TABLE сотрудники
ALTER COLUMN статус
SET DEFAULT 'активен';
Для SQL Server используется немного другой синтаксис, так как значения по умолчанию задаются через ограничения:
-- Сначала удалить старое ограничение
ALTER TABLE сотрудники
DROP CONSTRAINT DF_сотрудники_статус;
-- Затем создать новое
ALTER TABLE сотрудники
ADD CONSTRAINT DF_сотрудники_статус
DEFAULT 'активен' FOR статус;
В MySQL можно использовать следующую команду:
ALTER TABLE сотрудники
ALTER статус SET DEFAULT 'активен';
В SQLite значение по умолчанию можно изменить только через пересоздание таблицы, так как прямое изменение ограничено:
- Создать новую таблицу с нужным значением по умолчанию
- Перенести данные
- Удалить старую таблицу
- Переименовать новую
Перед внесением изменений следует убедиться в отсутствии зависимостей, которые могут быть нарушены, особенно при использовании внешних ключей или триггеров. Также стоит пересмотреть наличие связанных ограничений или логики на уровне приложения.
Как удалить значение по умолчанию у столбца
Удаление значения по умолчанию у столбца выполняется с помощью команды ALTER TABLE
и ключевого слова ALTER COLUMN
. В зависимости от СУБД синтаксис может отличаться.
В PostgreSQL используется выражение ALTER COLUMN имя_столбца DROP DEFAULT
. Пример:
ALTER TABLE users ALTER COLUMN age DROP DEFAULT;
В SQL Server применяется конструкция ALTER TABLE имя_таблицы DROP CONSTRAINT имя_ограничения
. Сначала необходимо определить имя ограничения по умолчанию. Для этого выполните запрос:
SELECT name FROM sys.default_constraints
WHERE parent_object_id = OBJECT_ID('users')
AND parent_column_id = COLUMNPROPERTY(object_id('users'), 'age', 'ColumnId');
После получения имени ограничения удалите его:
ALTER TABLE users DROP CONSTRAINT DF_users_age;
В MySQL до версии 8.0.13 используется:
ALTER TABLE users ALTER age DROP DEFAULT;
Начиная с версии 8.0.13 –
ALTER TABLE users ALTER COLUMN age DROP DEFAULT;
В Oracle применяется:
ALTER TABLE users MODIFY age DEFAULT NULL;
Это фактически эквивалентно удалению значения по умолчанию.
Как использовать функции в значениях по умолчанию
В SQL допустимо использовать определённые функции в качестве значений по умолчанию, но список этих функций ограничен и зависит от используемой СУБД. Например, в PostgreSQL можно задать NOW()
в качестве значения по умолчанию для поля с типом timestamp
, чтобы автоматически сохранять время вставки записи:
created_at TIMESTAMP DEFAULT NOW()
В MySQL также поддерживается CURRENT_TIMESTAMP
для DATETIME
и TIMESTAMP
полей. Начиная с версии 5.6.5, можно задавать и произвольные выражения, включая CURRENT_TIMESTAMP + INTERVAL 1 DAY
, но только при соблюдении специфики синтаксиса:
expires_at DATETIME DEFAULT (CURRENT_TIMESTAMP + INTERVAL 1 DAY)
В SQL Server разрешено использовать функцию GETDATE()
через конструкцию DEFAULT
при создании таблицы:
created_at DATETIME DEFAULT GETDATE()
Функции, возвращающие случайные значения, вроде RAND()
, нельзя использовать напрямую в качестве значения по умолчанию. Для таких случаев нужно использовать триггеры или устанавливать значение на уровне приложения.
Если требуется задать значение по умолчанию, основанное на вычислениях, которых нет в списке разрешённых функций, следует использовать генерацию значений через GENERATED ALWAYS AS
в поддерживаемых СУБД, как альтернатива:
total_price DECIMAL(10,2) GENERATED ALWAYS AS (price * quantity) STORED
Нельзя использовать функции, зависящие от состояния сеанса, параметров пользователя или нестабильного окружения. Это приводит к ошибкам при компиляции схемы. Используйте только детерминированные и разрешённые функции для надёжности и предсказуемости значений по умолчанию.
Как задать значение по умолчанию для столбца с типом дата и время
Пример создания таблицы с автозаполнением текущей даты и времени при вставке записи:
CREATE TABLE orders (
id INT PRIMARY KEY,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
);
В PostgreSQL значение CURRENT_TIMESTAMP
можно заменить на now()
, результат будет идентичен. Для Oracle используется SYSTIMESTAMP
.
В MySQL начиная с версии 5.6 допустимо использовать CURRENT_TIMESTAMP
также и для типа DATETIME
, ранее это было доступно только для TIMESTAMP
. Убедись, что используемая версия поддерживает это поведение.
Если требуется обновлять значение при каждом изменении строки, можно воспользоваться комбинацией DEFAULT CURRENT_TIMESTAMP
и ON UPDATE CURRENT_TIMESTAMP
:
CREATE TABLE logs (
id INT PRIMARY KEY,
modified_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Для значений по умолчанию, отличных от текущего времени, используется фиксированная дата в формате, соответствующем синтаксису конкретной СУБД:
CREATE TABLE events (
id INT PRIMARY KEY,
event_time DATETIME DEFAULT '2025-01-01 00:00:00'
);
Значение по умолчанию не применяется при явном указании значения в операторе INSERT
. Учитывай это при проектировании схемы базы данных.
Как проверить и найти значения по умолчанию в базе данных
В PostgreSQL для получения значений по умолчанию используйте запрос к системному каталогу information_schema.columns
:
SELECT column_name, column_default FROM information_schema.columns WHERE table_name = 'имя_таблицы';
В MySQL аналогичная информация доступна через:
SELECT COLUMN_NAME, COLUMN_DEFAULT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'имя_таблицы' AND TABLE_SCHEMA = 'имя_базы';
В SQL Server данные по умолчанию извлекаются через системные представления:
SELECT c.name AS column_name, d.definition AS default_value FROM sys.columns c LEFT JOIN sys.default_constraints d ON c.default_object_id = d.object_id WHERE c.object_id = OBJECT_ID('имя_схемы.имя_таблицы');
В Oracle используйте:
SELECT column_name, data_default FROM all_tab_columns WHERE table_name = 'ИМЯ_ТАБЛИЦЫ';
Учитывайте, что имена таблиц и схем должны быть в нужном регистре. Если значения по умолчанию не заданы, соответствующее поле будет содержать NULL. Для фильтрации только тех столбцов, где значение по умолчанию определено, добавьте условие IS NOT NULL
к проверяемому столбцу.