Должен ли первичный ключ (PRIMARY KEY) в базе данных быть уникальным?

«Должен ли первичный ключ (PRIMARY KEY) в базе данных быть уникальным?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, уникальность — это обязательное и фундаментальное свойство первичного ключа (PRIMARY KEY).

Требования к PRIMARY KEY:

  1. Уникальность: Каждое значение в столбце(ах) ключа должно быть уникальным в рамках таблицы.
  2. Непустота (NOT NULL): Значение не может быть NULL.
  3. Один на таблицу: В таблице может быть только один PRIMARY KEY.

Что происходит при нарушении уникальности? СУБД генерирует ошибку нарушения ограничения уникальности (например, SQLIntegrityConstraintViolationException в JDBC), и операция вставки или обновления откатывается.

Пример на SQL/Java:

CREATE TABLE users (
    id INT PRIMARY KEY, -- Этот столбец ДОЛЖЕН быть уникальным и не NULL
    name VARCHAR(100)
);
// Попытка вставить дубликат вызовет исключение
String sqlInsert = "INSERT INTO users (id, name) VALUES (?, ?)";
try (PreparedStatement pstmt = connection.prepareStatement(sqlInsert)) {
    pstmt.setInt(1, 1);
    pstmt.setString(2, "Alice");
    pstmt.executeUpdate(); // Успех
    pstmt.setInt(1, 1); // Тот же самый ID!
    pstmt.setString(2, "Bob");
    pstmt.executeUpdate(); // ВЫБРОСИТ SQLIntegrityConstraintViolationException
}

Распространенные стратегии генерации уникальных ключей:

  • AUTO_INCREMENT (MySQL), SERIAL/IDENTITY (PostgreSQL, SQL Server).
  • Генерация UUID на стороне приложения.
  • Составные ключи из нескольких полей (уникальность обеспечивается комбинацией).