В чем разница между первичным и уникальным ключом?sql-30

Оба типа ключей обеспечивают уникальность данных, но имеют важные различия:

1. Основные отличия

ХарактеристикаPRIMARY KEYUNIQUE KEY
Количество в таблицеТолько одинМожет быть несколько
NULL значенияЗапрещеныРазрешены (однако только один NULL в случае UNIQUE)
ИндексированиеВсегда создает кластерный индексСоздает некластерный индекс
Использование в связяхОсновной для внешних ключейНе используется для связей

2. Синтаксическая разница

-- Создание таблицы с первичным ключом
CREATE TABLE employees (
    id INT PRIMARY KEY,          -- Первичный ключ
    email VARCHAR(100) UNIQUE,   -- Уникальный ключ
    passport_number VARCHAR(20) UNIQUE
);
-- Альтернативный вариант объявления
CREATE TABLE departments (
    dept_id INT,
    dept_name VARCHAR(50),
    CONSTRAINT pk_departments PRIMARY KEY (dept_id),
    CONSTRAINT uk_departments_name UNIQUE (dept_name)
);

3. Практическое применение

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

  • Однозначно идентифицирует строку в таблице
  • Обязательный элемент реляционной таблицы
  • Пример: ID сотрудника, номер заказа

Уникальный ключ:

  • Гарантирует уникальность неосновных атрибутов
  • Может быть несколько на таблицу
  • Пример: email сотрудника, номер паспорта

4. Особенности работы

Для первичного ключа:

  • Не может быть NULL
  • Автоматически создает clustered index (в большинстве СУБД)
  • Является "лицом" строки для других таблиц

Для уникального ключа:

  • Может содержать NULL (но только один NULL в столбце)
  • Создает non-clustered index
  • Может применяться к комбинации столбцов

5. Пример из реальной практики

CREATE TABLE bank_accounts (
    account_id INT PRIMARY KEY,                 -- Основной идентификатор
    account_number VARCHAR(20) UNIQUE NOT NULL, -- Уникальный номер счета
    client_id INT NOT NULL,
    iban VARCHAR(34) UNIQUE,                    -- Может быть NULL, но если есть - должен быть уникальным
    FOREIGN KEY (client_id) REFERENCES clients(id)
);

Резюмируем: первичный ключ — это основной уникальный идентификатор строки, в то время как уникальный ключ обеспечивает дополнительные гарантии уникальности для других атрибутов таблицы. Выбор между ними зависит от бизнес-логики и требований к данным.