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

Что такое первичный ключ (Primary Key)?

2.0 Middle🔥 151 комментариев
#Машинное обучение

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

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

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

Первичный ключ (Primary Key): Полное объяснение

Первичный ключ (Primary Key) — это столбец или набор столбцов в таблице базы данных, который уникально идентифицирует каждую строку (запись). Это один из фундаментальных концептов реляционных баз данных и системы управления ими.

Определение и свойства

Первичный ключ обладает двумя критическими свойствами:

Уникальность (Uniqueness): каждое значение первичного ключа встречается ровно один раз в таблице. Два разных объекта не могут иметь одинаковый первичный ключ.

Целостность ссылок (Referential Integrity): первичный ключ гарантирует, что строка может быть уникально идентифицирована и на неё можно ссылаться из других таблиц.

Типы первичных ключей

1. Простой первичный ключ (Simple Primary Key)

Один столбец служит первичным ключом:

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(100) NOT NULL,
    email VARCHAR(100) NOT NULL
);

Обычно это уникальный идентификатор, часто автоматически генерируемый.

2. Составной первичный ключ (Composite Primary Key)

Комбинация нескольких столбцов служит первичным ключом:

CREATE TABLE student_courses (
    student_id INT NOT NULL,
    course_id INT NOT NULL,
    grade DECIMAL(3, 1),
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

Вместе эти столбцы образуют уникальный идентификатор.

Естественные vs Суррогатные ключи

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

Основан на реальных данных:

CREATE TABLE companies (
    company_registration_number VARCHAR(20) PRIMARY KEY,
    company_name VARCHAR(200) NOT NULL,
    country VARCHAR(50) NOT NULL
);

Преимущества:

  • Имеет смысл в контексте бизнеса
  • Нет необходимости в дополнительных столбцах

Недостатки:

  • Может измениться со временем
  • Обычно занимает больше места
  • Может быть составным

Суррогатный ключ (Surrogate Key)

Искусственный идентификатор, обычно автоинкрементирующееся целое число:

CREATE TABLE products (
    product_id SERIAL PRIMARY KEY,  -- автоинкремент
    product_name VARCHAR(200) NOT NULL,
    sku VARCHAR(50) UNIQUE NOT NULL,
    price DECIMAL(10, 2)
);

Преимущества:

  • Никогда не изменяется
  • Компактный размер
  • Простая работа с индексами
  • Удобен для связей между таблицами

Недостатки:

  • Не имеет бизнес-смысла
  • Требует дополнительного столбца

Первичный ключ и индексы

Первичный ключ автоматически создаёт уникальный индекс, обеспечивающий быстрый поиск и исключающий дубликаты:

-- При создании PRIMARY KEY автоматически создаётся индекс
CREATE TABLE employees (
    employee_id INT PRIMARY KEY,  -- индекс создан автоматически
    name VARCHAR(100),
    department_id INT
);

-- Эквивалентно:
CREATE TABLE employees (
    employee_id INT,
    name VARCHAR(100),
    department_id INT,
    PRIMARY KEY (employee_id)
);
CREATE UNIQUE INDEX idx_employee_id ON employees(employee_id);

Внешний ключ и целостность ссылок

Первичный ключ используется в качестве целевого столбца для внешних ключей:

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    username VARCHAR(100)
);

CREATE TABLE posts (
    post_id INT PRIMARY KEY,
    title VARCHAR(200),
    user_id INT NOT NULL,
    FOREIGN KEY (user_id) REFERENCES users(user_id)
);

Интерпретация: каждый пост должен принадлежать существующему пользователю.

UUID как первичный ключ

В современных системах часто используются UUID вместо автоинкремента:

CREATE TABLE users (
    id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
    username VARCHAR(100) NOT NULL,
    created_at TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);

Преимущества UUID:

  • Глобально уникален
  • Не требует центрального источника
  • Подходит для распределённых систем
  • Трудно угадать (безопасность)

Недостатки:

  • Занимает больше места (16 байт vs 4-8 для INT)
  • Медленнее для индексирования
  • Плохо читается

Операции с первичным ключом

import pandas as pd
import sqlalchemy as sa

# Установка первичного ключа в Pandas DataFrame
df = pd.DataFrame({
    'id': [1, 2, 3],
    'name': ['Alice', 'Bob', 'Charlie']
})
df_indexed = df.set_index('id')
print(df_indexed.index.name)  # 'id' (первичный ключ)

# SQL создание с PRIMARY KEY
engine = sa.create_engine('postgresql://user:password@localhost/db')
df.to_sql('users', engine, if_exists='replace', 
          index=False, dtype={'id': sa.Integer})

# Добавление PRIMARY KEY констрэйнта
with engine.connect() as conn:
    conn.execute(sa.text(
        'ALTER TABLE users ADD CONSTRAINT pk_users PRIMARY KEY (id)'
    ))

Лучшие практики

Всегда определяй первичный ключ:

-- Плохо
CREATE TABLE products (name VARCHAR(100), price DECIMAL);

-- Хорошо
CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    price DECIMAL NOT NULL
);

Выбери подходящий тип:

  • Для большинства таблиц: SERIAL или UUID
  • Для справочников: натуральный ключ
  • Для связей M2M: составной первичный ключ

Не изменяй первичный ключ: Это разрушит все связи с внешними ключами.

Используй NOT NULL: Первичный ключ всегда должен быть NOT NULL.

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