Может ли столбец в составе составного первичного ключа (Composite Primary Key) допускать значение NULL?

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

Ответ

Нет, не может. Согласно стандарту SQL и реляционной модели, все столбцы, входящие в первичный ключ (PK), должны быть NOT NULL.

Причина: Первичный ключ — это минимальный набор атрибутов, однозначно идентифицирующий каждую строку в таблице. Значение NULL означает «неизвестно» или «отсутствует», что нарушает принцип уникальной идентификации. Две строки с NULL в ключевом столбце нельзя было бы различить.

Пример ошибки в SQL:

CREATE TABLE Orders (
    order_id INT,
    line_item INT NULL, -- ОШИБКА: этот столбец не может быть NULL, если он часть PK
    product_name VARCHAR(100),
    PRIMARY KEY (order_id, line_item) -- Требует, чтобы order_id и line_item были NOT NULL
);

Правильное определение:

CREATE TABLE Orders (
    order_id INT NOT NULL,
    line_item INT NOT NULL, -- Явное указание NOT NULL обязательно
    product_name VARCHAR(100),
    PRIMARY KEY (order_id, line_item)
);

Альтернатива: Если нужна гибкость, можно использовать уникальный индекс (UNIQUE constraint), который в некоторых СУБД допускает NULL в составе, но это не является полноценной заменой первичного ключа.