Данных может быть много, но не все они полезные. Чтобы таблица не превратилась в помойку, PostgreSQL позволяет задавать ограничения. Это как простые правила, чтобы никто не записал в поле "имя" цифры или не оставил его пустым.
Что такое constraints?
Ограничения (constraints) в PostgreSQL — это как правила поведения в армии. Если их нет, то любой может делать что угодно: указать возраст пользователя как -999, добавить пустую строку вместо имени или дважды записать одного и того же студента под разными id. Чтобы этого не произошло, PostgreSQL предлагает механизмы контроля, называемые ограничениями.
Ограничения позволяют вам:
- Позволить вашим данным остаться валидными и согласованными.
- Убедиться, что данные соответствуют определенным правилам (например, возраст человека не может быть отрицательным).
- Ускорить поиск ошибок, если данные не соответствуют вашим ожиданиям.
Сегодня мы рассмотрим два самых распространенных ограничения: NOT NULL и UNIQUE.
Ограничение NOT NULL
Ограничение NOT NULL говорит PostgreSQL: "Эй, это поле всегда должно содержать значение. Неопределенность тут не пройдет!". Если вы попытаетесь добавить в таблицу строку, содержащую NULL, PostgreSQL выдаст ошибку. Это особенно полезно для тех полей, которые обязательны, например, имя или дата рождения студента.
Пример использования NOT NULL
CREATE TABLE teachers (
id SERIAL PRIMARY KEY, -- Уникальный идентификатор
name VARCHAR(100) NOT NULL, -- Имя преподавателя (обязательно)
subject VARCHAR(50) NOT NULL -- Предмет, который он ведет (обязательно)
);
В этом примере столбцы name и subject не могут остаться пустыми. Если вы попробуете вставить строку без указания значений для этих столбцов, то получите ошибку.
INSERT INTO teachers (name, subject)
VALUES (NULL, 'Mathematics');
Результат: ошибка! Вы не указали имя преподавателя, а name требует значения.
Ограничение UNIQUE: требуется уникальность
Ограничение UNIQUE гарантирует, что значения в столбце или комбинации столбцов не будут повторяться. Это полезно, если вам, например, нужно убедиться, что два студента не имеют одинакового номера зачетной книжки.
Если NOT NULL можно сравнить с требованием "все гости должны быть одеты", то UNIQUE — это "никаких одинаковых платьев на вечеринке".
Пример использования UNIQUE
CREATE TABLE departments (
id SERIAL PRIMARY KEY, -- Уникальный идентификатор
name VARCHAR(100) UNIQUE -- Название департамента должно быть уникальным
);
Теперь вы не сможете добавить два департамента с одним и тем же именем.
INSERT INTO departments (name) VALUES ('Mathematics');
INSERT INTO departments (name) VALUES ('Mathematics');
Результат: ошибка! Попытка вставить строку с дублирующим значением в столбце name.
Комбинированное ограничение UNIQUE
Вы также можете задать уникальность для комбинации двух (или более) столбцов. Например:
CREATE TABLE enrollments (
id SERIAL PRIMARY KEY, -- Уникальный идентификатор для записи
student_id INTEGER NOT NULL, -- Идентификатор студента
course_id INTEGER NOT NULL, -- Идентификатор курса
UNIQUE (student_id, course_id) -- Один студент не может записаться на один курс дважды
);
Теперь каждая пара student_id и course_id должна быть уникальной. Если кто-то попытается дважды записать одного и того же студента на один и тот же курс, PostgreSQL этому воспрепятствует.
Комбинирование ограничений: NOT NULL и UNIQUE
Вы можете комбинировать NOT NULL и UNIQUE для одного столбца. Например:
CREATE TABLE users (
username VARCHAR(50) NOT NULL UNIQUE, -- Уникальный логин, обязательный для заполнения
email VARCHAR(100) NOT NULL UNIQUE -- Уникальный адрес электронной почты, обязательный для заполнения
);
Здесь логин и адрес электронной почты должны быть уникальными и не могут оставаться пустыми.
Типичные ошибки при использовании ограничений
Если вы применяете UNIQUE к столбцу, но не добавляете ограничение NOT NULL, то можно ввести несколько строк с пустыми значениями NULL, так как PostgreSQL считает, что NULL не равен другому NULL. Если хотите запретить пустые значения, добавляйте NOT NULL.
Попытка добавить дублирующее значение в столбец с ограничением UNIQUE вызовет ошибку. Всегда проверяйте входные данные перед выполнением INSERT.
Использование слишком много ограничений может уменьшить производительность операций вставки.
Зачем всё это нужно?
Использование ограничений позволяет избежать множества проблем, таких как дублирование данных, пустые строки и другие ошибки, которые могут возникнуть из-за человеческого фактора. Они делают вашу базу данных "самоохраняемой", а при масштабных проектах это экономит бесценное время. На собеседованиях часто спрашивают про ограничения, так что знание NOT NULL и UNIQUE — это не только полезный навык, но и потенциал для впечатления будущих работодателей.
На следующей лекции мы разберём ограничение DEFAULT, которое позволяет задавать значения по умолчанию для столбцов, если пользователь ничего не указал. До встречи!
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ