Может ли PRIMARY KEY в SQL быть составным (composite)?

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

Ответ

Да, PRIMARY KEY может быть составным (composite), то есть состоять из двух или более столбцов таблицы. Уникальность записи в таком случае обеспечивается комбинацией значений этих столбцов.

Пример создания в SQL:

CREATE TABLE OrderItems (
    order_id INT NOT NULL,
    product_id INT NOT NULL,
    quantity INT,
    PRIMARY KEY (order_id, product_id) -- Составной первичный ключ
);

Особенности составного PRIMARY KEY:

  • Уникальность: Комбинация (order_id, product_id) должна быть уникальна.
  • NOT NULL: Все столбцы, входящие в ключ, неявно получают ограничение NOT NULL.
  • Индекс: Создается уникальный индекс по всем столбцам ключа, что ускоряет поиск и операции JOIN.

Реализация в JPA/Hibernate:

  1. С помощью @IdClass:

    @Entity
    @IdClass(OrderItemId.class)
    public class OrderItem {
        @Id private Long orderId;
        @Id private Long productId;
        private Integer quantity;
    }
    
    public class OrderItemId implements Serializable {
        private Long orderId;
        private Long productId;
        // Обязательно переопределить equals() и hashCode()
    }
  2. С помощью @EmbeddedId (часто предпочтительнее):

    @Entity
    public class OrderItem {
        @EmbeddedId
        private OrderItemId id;
        private Integer quantity;
    }
    
    @Embeddable
    public class OrderItemId implements Serializable {
        private Long orderId;
        private Long productId;
        // equals() и hashCode()
    }