Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Особенности ключей в базах данных
Предположу, что речь идет о PRIMARY KEY, FOREIGN KEY и других типах ключей. Расскажу об их особенностях.
PRIMARY KEY (Первичный ключ)
Особенности:
- Уникален — не может быть два одинаковых значения
- Not Null — не может быть пустым
- Один на таблицу — только один PRIMARY KEY
- Индекс — автоматически создается индекс
- Идентификатор — однозначно определяет строку
CREATE TABLE users (
id BIGINT PRIMARY KEY, -- Primary key
email VARCHAR(100),
name VARCHAR(100)
);
FOREIGN KEY (Внешний ключ)
Особенности:
- Ссылка — указывает на PRIMARY KEY другой таблицы
- Referential Integrity — обеспечивает целостность данных
- Ограничения — нельзя удалить/обновить родительскую запись, если есть зависимости
- Каскадные операции — ON DELETE CASCADE, ON UPDATE CASCADE
CREATE TABLE orders (
id BIGINT PRIMARY KEY,
user_id BIGINT,
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE
);
Если попытаться удалить пользователя с заказами:
DELETE FROM users WHERE id = 1; -- Ошибка! Есть зависимые заказы
UNIQUE KEY
Особенности:
- Уникален — как PRIMARY KEY, но может быть NULL
- Может быть несколько — на одной таблице
- Индекс — автоматически создается
CREATE TABLE users (
id BIGINT PRIMARY KEY,
email VARCHAR(100) UNIQUE, -- Уникальный, но может быть NULL
phone VARCHAR(20) UNIQUE
);
COMPOSITE KEY (Составной ключ)
Особенности:
- Несколько колонок — первичный ключ из 2+ полей
- Уникальная комбинация — значения в совокупности уникальны
- Используется в связях многие-ко-многим
CREATE TABLE student_courses (
student_id BIGINT,
course_id BIGINT,
PRIMARY KEY (student_id, course_id),
FOREIGN KEY (student_id) REFERENCES students(id),
FOREIGN KEY (course_id) REFERENCES courses(id)
);
Одно студент может быть на одном курсе только один раз, даже если таблица содержит миллионы записей.
INDEX KEY
Особенности:
- Для быстрого поиска — ускоряет SELECT запросы
- Медленнее UPDATE/DELETE — индекс нужно обновлять
- Может быть с NULL — в отличие от PRIMARY KEY
CREATE INDEX idx_email ON users(email);
CREATE INDEX idx_created_date ON orders(created_at);
Практический пример
CREATE TABLE company (
id BIGINT PRIMARY KEY,
name VARCHAR(100) NOT NULL,
tax_id VARCHAR(20) UNIQUE
);
CREATE TABLE employees (
id BIGINT PRIMARY KEY,
company_id BIGINT NOT NULL,
email VARCHAR(100) UNIQUE,
hire_date DATE,
FOREIGN KEY (company_id) REFERENCES company(id) ON DELETE CASCADE,
INDEX idx_company (company_id),
INDEX idx_hire_date (hire_date)
);
Это обеспечивает:
- Быстрый поиск по company_id
- Быстрый поиск по hire_date
- Целостность данных (нельзя удалить компанию с сотрудниками)
- Уникальность email адреса