← Назад к вопросам

Какие знаешь ключи в SQL?

2.3 Middle🔥 111 комментариев
#Базы данных и SQL

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Ключи в SQL: полный обзор

В SQL ключи (Keys) — это фундаментальная концепция, обеспечивающая целостность данных, производительность запросов и организацию связей между таблицами. Вот детальный разбор всех типов ключей, их назначения и примеров использования.

1. Первичный ключ (Primary Key)

Первичный ключ — столбец или набор столбцов, уникально идентифицирующий каждую запись в таблице. Это главный инструмент обеспечения целостности сущностей.

Характеристики:

  • Уникальность: Все значения в столбце(ах) должны быть уникальными.
  • Не NULL: Значения не могут быть NULL.
  • Один на таблицу: В таблице может быть только один первичный ключ.
  • Индексирование: Создаётся автоматически кластеризованный (или нет) индекс.
-- Создание таблицы с первичным ключом
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,  -- Первичный ключ с автоинкрементом
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL
);

-- Составной первичный ключ (из нескольких столбцов)
CREATE TABLE order_items (
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT DEFAULT 1,
    PRIMARY KEY (order_id, product_id)  -- Составной ключ
);

2. Внешний ключ (Foreign Key)

Внешний ключ устанавливает связь между двумя таблицами, обеспечивая ссылочную целостность данных. Столбец внешнего ключа в дочерней таблице ссылается на первичный ключ родительской таблицы.

Важные аспекты:

  • Поддерживает операции CASCADE, SET NULL, RESTRICT, NO ACTION
  • Предотвращает "осиротевшие" записи
  • Ускоряет JOIN-операции при правильном индексировании
-- Создание таблиц со связью через внешний ключ
CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    dept_id INT,
    -- Внешний ключ с каскадным обновлением
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
    ON UPDATE CASCADE
    ON DELETE RESTRICT
);

3. Уникальный ключ (Unique Key / Constraint)

Уникальный ключ гарантирует уникальность значений в столбце(ах), но, в отличие от первичного ключа, допускает одно значение NULL (зависит от СУБД).

CREATE TABLE products (
    id INT PRIMARY KEY,
    sku VARCHAR(20) UNIQUE,  -- Уникальный ключ на SKU
    name VARCHAR(200) NOT NULL,
    UNIQUE (name, category_id)  -- Составной уникальный ключ
);

4. Ключ-кандидат (Candidate Key)

Ключ-кандидат — любой столбец или комбинация столбцов, которые могли бы стать первичным ключом. Из всех кандидатов выбирается один первичный ключ, остальные могут стать уникальными ключами.

-- В таблице users потенциальные ключи-кандидаты:
-- 1. id (выбран как первичный ключ)
-- 2. username (становится уникальным ключом)
-- 3. email (становится уникальным ключом)

5. Суперключ (Super Key)

Суперключ — это любой набор столбцов, который однозначно идентифицирует запись. Он может включать избыточные столбцы. Каждый первичный ключ является суперключом, но не каждый суперключ подходит как первичный ключ.

6. Составной ключ (Composite Key)

Составной ключ — ключ, состоящий из двух или более столбцов. Может быть первичным, уникальным или внешним ключом.

-- Пример составного первичного и внешнего ключа
CREATE TABLE student_courses (
    student_id INT NOT NULL,
    course_id INT NOT NULL,
    enrollment_date DATE,
    grade CHAR(1),
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students(id),
    FOREIGN KEY (course_id) REFERENCES courses(id)
);

7. Естественный и суррогатный ключи (Natural vs Surrogate Keys)

  • Естественный ключ: Использует существующие бизнес-данные (ISBN книги, паспортные данные)
  • Суррогатный ключ: Искусственный идентификатор, созданный системой (AUTO_INCREMENT, UUID)
-- Суррогатный ключ (рекомендуется для большинства случаев)
CREATE TABLE customers (
    customer_id INT PRIMARY KEY AUTO_INCREMENT,
    passport_number VARCHAR(20) UNIQUE  -- Естественный ключ
);

-- Генерация UUID как суррогатного ключа (PostgreSQL пример)
CREATE TABLE sessions (
    session_id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    user_id INT NOT NULL
);

Практическое значение ключей для Backend-разработчика

  1. Производительность: Индексы, создаваемые для ключей, ускоряют поиск, сортировку и JOIN-операции. Например, внешний ключ без индекса может привести к блокировкам таблиц.

  2. Целостность данных: Ключи предотвращают дублирование, обеспечивают валидность связей. В приложениях с высокой нагрузкой это критически важно.

  3. Архитектура приложения: Выбор между суррогатными и естественными ключами влияет на миграции, репликацию и sharding. Суррогатные ключи (особенно BIGINT или UUID) часто предпочтительнее для масштабируемости.

  4. Оптимизация запросов: Понимание ключей помогает писать эффективные запросы:

-- Понимание, что внешний ключ создаёт индекс
EXPLAIN SELECT e.name, d.name 
FROM employees e
JOIN departments d ON e.dept_id = d.dept_id;  -- Использует индекс внешнего ключа
  1. Ограничения СУБД: Разные СУБД по-разному реализуют ключи. В MySQL InnoDB автоматически индексирует внешние ключи, а в некоторых СУБД — нет. В PostgreSQL уникальные ключи позволяют несколько NULL-значений, а в Oracle — нет.

Рекомендации для PHP Backend-разработчика:

  • Всегда используйте первичные ключи, предпочтительно суррогатные (AUTO_INCREMENT или UUID)
  • Внешние ключи должны быть явно объявлены на уровне БД, а не только в логике приложения
  • Для часто используемых полей в WHERE/JOIN создавайте уникальные ключи или индексы
  • Мониторьте производительность: SHOW INDEX FROM table_name в MySQL или pg_indexes_size() в PostgreSQL
  • В миграциях (Laravel, Symfony) явно указывайте все ключи

Ключи в SQL — не просто синтаксис, а основа проектирования надежных, производительных и масштабируемых приложений. Их правильное использование напрямую влияет на стабильность backend-системы.

Какие знаешь ключи в SQL? | PrepBro