← Назад к вопросам
Что такое первичный ключ (Primary Key)?
1.0 Junior🔥 241 комментариев
#Базы данных и SQL
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI28 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Первичный ключ (Primary Key) в базах данных
Первичный ключ — это ограничение в таблице БД, которое однозначно идентифицирует каждую строку. Это один из самых важных концептов в реляционных базах данных.
Определение
Первичный ключ — это столбец (или набор столбцов), который:
- Уникален — никакие две строки не имеют одинаковое значение
- Не может быть NULL — всегда имеет значение
- Неизменяем — значение не меняется на протяжении жизни записи
- Идентифицирует строку — по 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
- Всегда есть Primary Key — каждая таблица должна иметь PRIMARY KEY
- Используй UUID или BIGINT — для масштабируемости
- Не обновляй Primary Key — это может нарушить relationships
- Natural vs Surrogate Key:
- Surrogate (UUID, INT) — искусственный, рекомендуется
- Natural (email, username) — значимый, можно использовать, но рискованно
- Индексирование — PRIMARY KEY автоматически индексируется
Почему Primary Key важен
- Уникальность — БД гарантирует отсутствие дублей
- Производительность — быстрый поиск через индекс
- Referential Integrity — связь между таблицами
- Транзакции — корректная работа ACID свойств
- Репликация — используется для синхронизации между базами