Первичные ключи и уникальность
Разберитесь с первичными ключами, суррогатными и естественными ключами, составными ключами и тем, почему каждой строке нужен надёжный уникальный идентификатор
«Первичные ключи и уникальность» — бесплатный урок SQL Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.
Почему каждой строке нужен уникальный идентификатор
Чтобы безопасно изменить или удалить конкретную строку, необходимо иметь возможность однозначно указать на неё.
- Могут существовать два пользователя по имени "Alice Adams"
- Но не может существовать два пользователя с
id = 42 - Уникальный идентификатор называется первичным ключом
Объявление первичного ключа
Столбец обозначается как первичный ключ при создании таблицы:
CREATE TABLE products (
id BIGSERIAL PRIMARY KEY,
sku VARCHAR(50) NOT NULL,
name VARCHAR(200) NOT NULL,
price NUMERIC(10,2) NOT NULL
);Первичный ключ = NOT NULL + UNIQUE
PRIMARY KEY автоматически обеспечивает соблюдение следующих правил:
- NOT NULL — значения первичного ключа не могут отсутствовать
- UNIQUE — никакие две строки не могут иметь одинаковое значение первичного ключа
База данных также создаёт уникальный индекс для первичного ключа, поэтому поиск по идентификатору выполняется быстро.
Суррогатные и естественные ключи
Для первичного ключа есть два варианта:
- Суррогатный — искусственный идентификатор, который создаёт база данных (BIGSERIAL, UUID). Наиболее распространённый вариант в современных приложениях.
- Естественный — идентификатор из реального мира (адрес электронной почты, ISBN). Рискованный вариант: люди меняют адреса электронной почты.
Рекомендуемый подход: используйте суррогатный идентификатор и добавьте ограничение UNIQUE для естественного ключа.
BIGSERIAL: целые числа с автоинкрементом
В PostgreSQL BIGSERIAL создаёт 64-битный столбец с автоинкрементом, работающий на основе последовательности.
CREATE TABLE orders (
id BIGSERIAL PRIMARY KEY,
user_id BIGINT NOT NULL,
total NUMERIC(10,2) NOT NULL
);
-- You omit id on insert and the DB fills it in:
INSERT INTO orders (user_id, total) VALUES (7, 99.50);Первичные ключи UUID
Альтернативный вариант — 128-битный UUID, полезный, когда идентификаторы должны быть уникальными в разных системах или создаваться на стороне клиента.
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
CREATE TABLE sessions (
id UUID PRIMARY KEY DEFAULT uuid_generate_v4(),
user_id BIGINT NOT NULL,
ip INET
);Составные первичные ключи
Иногда естественный идентификатор представляет собой комбинацию столбцов:
CREATE TABLE order_items (
order_id BIGINT NOT NULL,
product_id BIGINT NOT NULL,
quantity INT NOT NULL,
PRIMARY KEY (order_id, product_id)
);
-- The pair (order_id, product_id) must be unique
-- A product can appear at most once per orderОграничения UNIQUE и первичный ключ
Можно объявить другие столбцы уникальными, не делая их первичным ключом:
CREATE TABLE users (
id BIGSERIAL PRIMARY KEY,
email VARCHAR(255) NOT NULL UNIQUE,
username VARCHAR(50) UNIQUE
);
-- INSERT below fails on the second row:
INSERT INTO users (email, username) VALUES ('a@x.com', 'alice');
INSERT INTO users (email, username) VALUES ('a@x.com', 'bob'); -- ERRORЧто происходит при вставке дубликата
Если попытаться вставить дубликат первичного ключа, база данных отклонит весь оператор:
ERROR: duplicate key value violates unique constraint "users_pkey" DETAIL: Key (id)=(42) already exists.
Это хорошо: так предотвращается незаметное повреждение данных.
Быстрый поиск строк по первичному ключу
Уникальный индекс первичного ключа обеспечивает поиск за O(log n) даже в таблицах с миллиардами строк.
-- Index Scan using users_pkey on users (cost=0.43..8.45 rows=1)
SELECT email FROM users WHERE id = 42;Не используйте идентификаторы повторно
Даже после удаления строки НЕ используйте её первичный ключ повторно. На него всё ещё могут ссылаться другие таблицы или внешние системы. Пусть последовательность продолжает увеличиваться — идентификаторы стоят дёшево.
Повторение
Первичные ключи дают каждой строке стабильный уникальный идентификатор.
- Предпочитайте суррогатные ключи (BIGSERIAL или UUID)
- Используйте UNIQUE для естественных ключей, которые не должны дублироваться
- Составные первичные ключи позволяют выразить правило «эта пара должна быть уникальной»
Быстрая проверка
Что неявно обеспечивается с помощью PRIMARY KEY?
Часто задаваемые вопросы
Урок «Первичные ключи и уникальность» бесплатный?
Да — полный текст урока «Первичные ключи и уникальность» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.
Чему я научусь в уроке «Первичные ключи и уникальность»?
Разберитесь с первичными ключами, суррогатными и естественными ключами, составными ключами и тем, почему каждой строке нужен надёжный уникальный идентификатор Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать SQL Academy?
Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.
Сколько времени занимает урок «Первичные ключи и уникальность»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке SQL Academy?
Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Что такое RDBMS и почему важны таблицы
- Первичные ключи и уникальность
- NULL: третье логическое значение
- Обзор типов данных: INT VARCHAR DATE BOOLEAN