0Pricing
SQL Academy · Урок

Первичные ключи и уникальность

Разберитесь с первичными ключами, суррогатными и естественными ключами, составными ключами и тем, почему каждой строке нужен надёжный уникальный идентификатор

«Первичные ключи и уникальность» — бесплатный урок 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 — локальная установка не требуется.

Все уроки этого курса

  1. Что такое RDBMS и почему важны таблицы
  2. Первичные ключи и уникальность
  3. NULL: третье логическое значение
  4. Обзор типов данных: INT VARCHAR DATE BOOLEAN
← Назад к SQL Academy