Что такое первичный ключ (Primary Key) в контексте баз данных? Опишите его ключевые свойства, назначение и приведите примеры.

Ответ

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

Ключевые свойства:

  1. Уникальность (Uniqueness): Каждое значение в столбце (или комбинация значений в столбцах) первичного ключа должно быть уникальным. Дубликаты не допускаются.
  2. Отсутствие NULL (NOT NULL): Поле первичного ключа не может содержать NULL значений. Каждая запись обязана иметь значение первичного ключа.
  3. Неизменность (Immutability): Хотя базы данных технически могут позволить изменять значение первичного ключа, это считается плохой практикой. Ключ, идентифицирующий запись, не должен меняться в течение её жизненного цикла.

Основное назначение:

  • Идентификация записей: Главная задача — обеспечить надежный способ найти, обновить или удалить конкретную строку в таблице.
  • Связывание таблиц: Первичный ключ одной таблицы используется как внешний ключ (Foreign Key) в другой для создания связей между ними.
  • Оптимизация запросов: Наличие первичного ключа почти всегда означает создание кластеризованного индекса (в большинстве СУБД), что делает поиск по этому ключу максимально быстрым.

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

  • Суррогатный ключ (Surrogate Key): Искусственно сгенерированный ключ, не имеющий бизнес-смысла. Чаще всего это автоинкрементное целое число (AUTO_INCREMENT, SERIAL) или UUID. Это предпочтительный подход в большинстве случаев.
  • Естественный ключ (Natural Key): Ключ, который является атрибутом из реального мира (например, номер паспорта, email, VIN-код автомобиля). Используется реже, так как такие данные могут меняться или оказаться неуникальными.
  • Составной ключ (Composite Key): Ключ, состоящий из двух или более столбцов. Используется, когда уникальность строки можно определить только комбинацией значений.

Примеры:

1. SQL (Суррогатный ключ)

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY, -- Суррогатный ключ
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100) NOT NULL UNIQUE
);

2. Go (с использованием ORM GORM)

В Go при работе с базами данных через ORM, такой как GORM, первичный ключ обычно определяется тегом структуры.

// Пример структуры для ORM GORM в Go
type User struct {
    // GORM по умолчанию использует поле 'ID' как первичный ключ.
    // Тег `gorm:"primary_key"` можно указать явно.
    ID   uint   `gorm:"primary_key"`
    Name string `gorm:"size:100;not null"`
    Email string `gorm:"unique;not null"`
}