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

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

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

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

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

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

Первичный ключ (Primary Key) в базах данных

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

Определение

Первичный ключ — это столбец (или набор столбцов), который:

  1. Уникален — никакие две строки не имеют одинаковое значение
  2. Не может быть NULL — всегда имеет значение
  3. Неизменяем — значение не меняется на протяжении жизни записи
  4. Идентифицирует строку — по PK можно однозначно найти нужную строку

Примеры в SQL

Одностолбцовый Primary Key:

CREATE TABLE users (
  id INT PRIMARY KEY,
  name VARCHAR(100),
  email VARCHAR(100)
);

-- или альтернативный синтаксис
CREATE TABLE users (
  id INT,
  name VARCHAR(100),
  email VARCHAR(100),
  PRIMARY KEY (id)
);

Многостолбцовый Primary Key (составной):

CREATE TABLE order_items (
  order_id INT,
  product_id INT,
  quantity INT,
  PRIMARY KEY (order_id, product_id)
);

-- Уникальность достигается комбинацией order_id + product_id
-- Можно добавить order_id=1, product_id=1
-- И order_id=1, product_id=2
-- Но нельзя добавить order_id=1, product_id=1 ещё раз

UUID как Primary Key

В современных приложениях часто используют UUID вместо auto-incrementing integers:

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(100),
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

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

  • Уникален глобально (не нужна координация между базами)
  • Не раскрывает информацию о количестве записей
  • Хороший для распределённых систем

Недостатки UUID:

  • Больше памяти (16 байт vs 4 байта для INT)
  • Медленнее индексируется
  • Менее читаемо в логах

Связь с другими таблицами (Foreign Key)

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

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100)
);

CREATE TABLE posts (
  id INT PRIMARY KEY AUTO_INCREMENT,
  user_id INT,
  title VARCHAR(200),
  FOREIGN KEY (user_id) REFERENCES users(id)
);

-- user_id в таблице posts должен соответствовать
-- существующему id в таблице users

В ORM (TypeScript / Node.js)

TypeORM пример:

import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm';

@Entity('users')
export class User {
  @PrimaryGeneratedColumn('uuid')
  id: string;

  @Column()
  name: string;

  @Column()
  email: string;
}

// При сохранении
const user = new User();
user.name = 'John';
user.email = 'john@example.com';
await userRepository.save(user); // id генерируется автоматически

Sequelize пример:

const User = sequelize.define('User', {
  id: {
    type: DataTypes.UUID,
    defaultValue: DataTypes.UUIDV4,
    primaryKey: true
  },
  name: DataTypes.STRING,
  email: DataTypes.STRING
});

Типы Primary Keys

Auto-Incrementing Integer:

CREATE TABLE users (
  id INT PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(100)
);

-- id=1, id=2, id=3, ... генерируются автоматически

UUID (случайный уникальный идентификатор):

CREATE TABLE users (
  id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
  name VARCHAR(100)
);

-- id='550e8400-e29b-41d4-a716-446655440000'

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

CREATE TABLE subscriptions (
  user_id INT,
  service_id INT,
  subscribed_at TIMESTAMP,
  PRIMARY KEY (user_id, service_id)
);

-- Комбинация (user_id, service_id) должна быть уникальна

Проблемы при работе с Primary Keys

Проблема 1: NULL значения

-- Это вызовет ошибку!
INSERT INTO users (id, name) VALUES (NULL, 'John');
-- Error: PRIMARY KEY cannot be NULL

Проблема 2: Дублирование

INSERT INTO users (id, name) VALUES (1, 'John');
INSERT INTO users (id, name) VALUES (1, 'Jane');
-- Error: Duplicate entry '1' for key 'users.PRIMARY'

Проблема 3: Нарушение Foreign Key

-- Если пытаемся добавить post с user_id=999,
-- но пользователя с id=999 не существует
INSERT INTO posts (user_id, title) VALUES (999, 'My Post');
-- Error: Foreign key constraint fails

Best Practices

  1. Всегда есть Primary Key — каждая таблица должна иметь PRIMARY KEY
  2. Используй UUID или BIGINT — для масштабируемости
  3. Не обновляй Primary Key — это может нарушить relationships
  4. Natural vs Surrogate Key:
    • Surrogate (UUID, INT) — искусственный, рекомендуется
    • Natural (email, username) — значимый, можно использовать, но рискованно
  5. Индексирование — PRIMARY KEY автоматически индексируется

Почему Primary Key важен

  • Уникальность — БД гарантирует отсутствие дублей
  • Производительность — быстрый поиск через индекс
  • Referential Integrity — связь между таблицами
  • Транзакции — корректная работа ACID свойств
  • Репликация — используется для синхронизации между базами
Что такое первичный ключ (Primary Key)? | PrepBro