Иногда мы не хотим заполнять все поля вручную — ну, лень или просто нет нужных данных. В таких случаях можно заранее задать значения по умолчанию, чтобы база сама подставила их, когда нужно.
Вставка строк в таблицу
Значения по умолчанию сильно связаны со вставкой строк в таблицу. Поэтому сейчас я кратко расскажу об этом, а через пару уровней мы повторно вернемся к этой теме и уделим ей столько внимания, сколько она заслуживает.
Добавлять строки в таблицу очень просто - для этого есть специальная команда INSERT INTO. INSERT INTO — это оператор SQL, который добавляет новые строки в таблицу. Он один из самых часто используемых, особенно при работе с веб-формами, логами, регистрацией пользователей и обновлением данных.
Синтаксис команды
INSERT INTO таблица (колонка1, колонка2, ...)
VALUES (значение1, значение2, ...);
Пояснение:
таблица— имя таблицы, в которую добавляются данные.колонка1,колонка2, ... — перечисление столбцов (можно опустить, если значения идут во всех столбцах в правильном порядке).значение1,значение2, ... — значения, соответствующие перечисленным столбцам.
Простой пример
INSERT INTO users (name, email)
VALUES ('Alice', 'alice@example.com');
Добавляет в таблицу users одну строку: имя — "Alice", email — "alice@example.com".
Результат:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
Вставка нескольких строк за раз
Также можно вставить несколько записей за один запрос — быстрее и экономичнее.
INSERT INTO users (name, email)
VALUES
('Alice', 'alice@example.com'),
('Bob', 'bob@example.net'),
('Charlie', 'charlie@example.org'),
('Diana', 'diana@example.com'),
('Eve', 'eve@example.net');
И вот какой будет результат:
| id | name | |
|---|---|---|
| 1 | Alice | alice@example.com |
| 2 | Bob | bob@example.net |
| 3 | Charlie | charlie@example.org |
| 4 | Diana | diana@example.com |
| 5 | Eve | eve@example.net |
Значение по умолчанию
Помните синтаксис команды по добавлению строк?
INSERT INTO таблица (колонка1, колонка2, ...)
VALUES (значение1, значение2, ...);
Как думаете, зачем там список колонок: колонка1, колонка2 ? Ведь можно же просто указать значения в том же порядке, что и колонки таблицы.
Дело в том, что очень много значений можно не указывать при добавлении данных. Например ID новой строки PostgreSQL вычислит сам при добавлении. Так же он может сам вычислить текущую дату/время добавления строки и внести ее в соответствующую колонку. Если какие-то данные не были переданы, то PostgreSQL заменит их на NULL.
PostgreSQL может сделать за вас много всего полезного. И вы можете управлять этим процессом — для этого и существуют значения по умолчанию, задаваемые с помощью ключевого слова DEFAULT.
Значение по умолчанию применяется в том случае, если при добавлении записи для конкретного столбца не указано значение. Это не только экономит время, но и предотвращает случайные ошибки, такие как пропуск важного значения.
Как работает DEFAULT?
Давайте разберемся с синтаксисом. Значения по умолчанию задаются на этапе создания таблицы. Вот общий формат использования:
CREATE TABLE таблица (
колонка тип_данных DEFAULT значение_по_умоланию
);
Или, если вам нужно добавить значение по умолчанию для существующей таблицы:
ALTER TABLE таблица
ALTER COLUMN колонка
SET DEFAULT значение_по_умоланию;
Подробнее я расскажу об изменении таблиц буквально через пару лекций :P
Пример 1: Таблица с полем DEFAULT
Создадим таблицу students, в которой каждый студент будет автоматически получать дату регистрации:
CREATE TABLE students (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
registration_date DATE DEFAULT CURRENT_DATE
);
Теперь, когда вы добавляете нового студента без указания registration_date, PostgreSQL автоматически заполнит это поле текущей датой.
INSERT INTO students (name) VALUES ('Alex Lin');
При запросе:
SELECT * FROM students;
Вы получите следующий результат:
| id | name | registration_date |
|---|---|---|
| 1 | Alex Lin | 2023-10-15 |
Практические примеры
Значение по умолчанию для числового столбца
Допустим, у нас есть таблица grades, где в столбце grade должно быть значение по умолчанию 0, если оценка еще не выставлена.
CREATE TABLE grades (
id SERIAL PRIMARY KEY,
student_id INTEGER NOT NULL,
course_id INTEGER NOT NULL,
grade INTEGER DEFAULT 0
);
Добавим запись без указания grade:
INSERT INTO grades (student_id, course_id) VALUES (1, 101);
Теперь таблица будет выглядеть так:
| id | student_id | course_id | grade |
|---|---|---|---|
| 1 | 1 | 101 | 0 |
Использование TEXT со значением по умолчанию
Представьте таблицу teachers, где каждому преподавателю автоматически присваивается статус «не подтвержден» при добавлении.
CREATE TABLE teachers (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
status TEXT DEFAULT 'unverified'
);
Добавим преподавателя без указания статуса:
INSERT INTO teachers (name) VALUES ('Peter Pall');
Результат будет таким:
| id | name | status |
|---|---|---|
| 1 | Peter Pall | unverified |
Значения по умолчанию для времени
Для таблицы meetings, в которой хранятся данные о встречах, можно задать поле meeting_time, указывающее стандартное время начала: 10:00 утра.
CREATE TABLE meetings (
id SERIAL PRIMARY KEY,
topic VARCHAR(100),
meeting_time TIME DEFAULT '10:00'
);
Добавляем запись:
INSERT INTO meetings (topic) VALUES ('Обсуждение проекта');
Результат:
| id | topic | meeting_time |
|---|---|---|
| 1 | Обсуждение проекта | 10:00 |
Типичные ошибки при использовании DEFAULT
Несоответствие типа данных значению по умолчанию. Если вы пытаетесь задать текстовое значение для числового столбца, PostgreSQL будет ругаться:
CREATE TABLE example (
number INTEGER DEFAULT 'text'
);
Ошибка:
invalid input syntax for type integer.
Изменение DEFAULT без учета существующих записей. Когда вы меняете значение по умолчанию, это не влияет на уже добавленные записи — они сохраняют старое поведение. Если вы хотите обновить существующие строки, используйте UPDATE.
UPDATE students SET registration_date = '2023-01-01' WHERE registration_date IS NULL;
Путаница между DEFAULT и NOT NULL. Значение по умолчанию не означает, что поле автоматически становится обязательным (NOT NULL). Без явного указания NOT NULL столбец может принимать значение NULL.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ