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

Какие бывают ключи в SQL?

1.0 Junior🔥 231 комментариев
#SQL и базы данных

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

Типы ключей в SQL

Определение

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

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

Определение: Уникально идентифицирует каждую строку в таблице. В таблице может быть только один primary key.

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

  • Не может содержать NULL значения
  • Каждое значение уникально
  • Часто используется для связей с другими таблицами
  • СУБД автоматически создаёт индекс на primary key
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

-- Или альтернативный синтаксис
CREATE TABLE orders (
    order_id INT,
    user_id INT,
    order_date DATE,
    PRIMARY KEY (order_id)
);

-- Composite Primary Key (составной первичный ключ)
CREATE TABLE course_enrollments (
    student_id INT,
    course_id INT,
    enrollment_date DATE,
    PRIMARY KEY (student_id, course_id)
);

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

Определение: Атрибут в одной таблице, который ссылается на primary key в другой таблице. Используется для связи таблиц.

Назначение:

  • Обеспечивает referential integrity (целостность ссылок)
  • Предотвращает удаление или изменение записей, на которые ссылаются другие таблицы
  • Дефинирует связи между таблицами (1:N, M:N)
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    name VARCHAR(100),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES departments(department_id)
);

-- Каскадное удаление
CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    user_id INT,
    order_date DATE,
    FOREIGN KEY (user_id) REFERENCES users(user_id) ON DELETE CASCADE
);

-- Каскадное обновление
CREATE TABLE order_items (
    item_id INT PRIMARY KEY,
    order_id INT,
    product_id INT,
    FOREIGN KEY (order_id) REFERENCES orders(order_id) ON UPDATE CASCADE
);

Опции действий при удалении/обновлении:

  • CASCADE — удалить/обновить связанные записи
  • SET NULL — установить NULL в FK поле
  • RESTRICT — запретить удаление (по умолчанию)
  • NO ACTION — аналог RESTRICT
  • SET DEFAULT — установить значение по умолчанию

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

Определение: Атрибут или комбинация атрибутов, которые должны быть уникальны, но могут отличаться от primary key.

Различия от Primary Key:

  • Может быть несколько unique keys в таблице (только один primary key)
  • Может содержать NULL значения (в большинстве СУБД)
  • Не обязателен для связей с другими таблицами
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    email VARCHAR(100) UNIQUE NOT NULL,
    username VARCHAR(50) UNIQUE,
    phone_number VARCHAR(20) UNIQUE
);

-- Составной уникальный ключ
CREATE TABLE inventory (
    inventory_id INT PRIMARY KEY,
    warehouse_id INT,
    product_id INT,
    quantity INT,
    UNIQUE (warehouse_id, product_id) -- один продукт не может быть дважды в одном складе
);

4. Candidate Key (Кандидат на первичный ключ)

Определение: Атрибут или комбинация атрибутов, которые могут быть выбраны в качестве primary key, но не выбраны.

Пример:

CREATE TABLE employees (
    employee_id INT PRIMARY KEY,      -- выбран как PK
    email VARCHAR(100) UNIQUE,        -- candidate key 1
    employee_number VARCHAR(20),      -- candidate key 2
    ssn VARCHAR(20) UNIQUE            -- candidate key 3 (SSN - номер соцстраха)
);

-- Любой из этих атрибутов мог быть primary key
-- но выбран employee_id

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

Определение: Набор атрибутов, который уникально идентифицирует запись. Может содержать дополнительные атрибуты.

Пример:

CREATE TABLE students (
    student_id INT,
    email VARCHAR(100),
    name VARCHAR(100)
);

-- Супер-ключи:
-- {student_id} — минимальный
-- {student_id, email} — излишний
-- {student_id, email, name} — излишний
-- {email} — если email уникален

6. Alternate Key (Альтернативный ключ)

Определение: Candidate key, который не был выбран в качестве primary key.

-- Из примера выше:
-- email, employee_number, ssn — альтернативные ключи
-- (они могли быть PK, но вместо них выбран employee_id)

7. Artificial/Surrogate Key (Искусственный ключ)

Определение: Автогенерируемый ключ, не имеющий бизнес-смысла. Используется для удобства и производительности.

CREATE TABLE products (
    product_id INT PRIMARY KEY AUTO_INCREMENT,  -- искусственный ключ
    ean_code VARCHAR(20) UNIQUE,                 -- естественный ключ
    name VARCHAR(100),
    price DECIMAL(10,2)
);

-- В PostgreSQL
CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,
    ean_code VARCHAR(20) UNIQUE NOT NULL,
    name VARCHAR(100),
    price DECIMAL(10,2)
);

-- Или более современный способ
CREATE TABLE products (
    product_id BIGINT PRIMARY KEY GENERATED ALWAYS AS IDENTITY,
    ean_code VARCHAR(20) UNIQUE NOT NULL,
    name VARCHAR(100),
    price DECIMAL(10,2)
);

8. Natural Key (Естественный ключ)

Определение: Ключ, состоящий из атрибутов, имеющих реальное бизнес-значение.

CREATE TABLE countries (
    country_code CHAR(2) PRIMARY KEY,  -- ISO 3166-1 alpha-2
    country_name VARCHAR(100),
    region VARCHAR(50)
);

-- country_code — естественный ключ (код страны имеет бизнес-смысл)

CREATE TABLE currency_rates (
    currency_code CHAR(3),             -- ISO 4217
    date DATE,
    exchange_rate DECIMAL(10,4),
    PRIMARY KEY (currency_code, date)
);

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

Определение: Primary key, состоящий из двух или более атрибутов.

CREATE TABLE sales (
    product_id INT,
    warehouse_id INT,
    date DATE,
    quantity INT,
    revenue DECIMAL(12,2),
    PRIMARY KEY (product_id, warehouse_id, date)
);

-- Каждая комбинация product_id + warehouse_id + date должна быть уникальна

Сравнительная таблица

Тип ключаУникальностьМожет быть NULLМожет быть несколькоНазначение
Primary KeyДаНет1Основной идентификатор
Foreign KeyНетДаМногоСвязь с другой таблицей
Unique KeyДаДа (обычно)МногоАльтернативный уникальный идентификатор
Candidate KeyДаНетМногоПотенциальный primary key

Практические рекомендации

-- ХОРОШО: Использование искусственного PK
CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    email VARCHAR(100) UNIQUE NOT NULL,
    username VARCHAR(50) UNIQUE NOT NULL
);

-- Индексы на часто используемые поля для поиска
CREATE INDEX idx_users_email ON users(email);
CREATE INDEX idx_users_username ON users(username);

-- ХОРОШО: Использование составного ключа для связей many-to-many
CREATE TABLE user_roles (
    user_id INT NOT NULL REFERENCES users(id) ON DELETE CASCADE,
    role_id INT NOT NULL REFERENCES roles(id) ON DELETE CASCADE,
    PRIMARY KEY (user_id, role_id)
);

Вывод

Выбор правильного типа ключа критичен для:

  • Целостности данных — ключи предотвращают дублирование и ошибки
  • Производительности — индексы на ключах ускоряют поиск и объединения
  • Масштабируемости — правильная схема БД упрощает расширение системы
  • Поддерживаемости — ясная структура ключей облегчает понимание схемы
Какие бывают ключи в SQL? | PrepBro