Могут ли в столбце с Foreign Key (внешним ключом) содержаться повторяющиеся (одинаковые) значения?

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

Ответ

Ответ зависит от того, на какой столбец ссылается внешний ключ.

1. Если FOREIGN KEY ссылается на PRIMARY KEY или UNIQUE столбец

Дублирование значений ВОЗМОЖНО. Внешний ключ требует, чтобы каждое значение в его столбце существовало в целевом столбце (REFERENCES), но не требует уникальности у себя.

CREATE TABLE Departments (
    id INT PRIMARY KEY, -- Уникальные значения
    name VARCHAR(100)
);

CREATE TABLE Employees (
    id INT PRIMARY KEY,
    name VARCHAR(100),
    department_id INT,
    FOREIGN KEY (department_id) REFERENCES Departments(id)
);
-- В Employees.department_id могут быть дубли: многие сотрудники в одном отделе.
INSERT INTO Employees VALUES (1, 'Alice', 10), (2, 'Bob', 10); -- ОК

2. Если FOREIGN KEY ссылается на столбец БЕЗ ограничения UNIQUE

Такая ситуация в стандартном SQL невозможна.

-- НЕВАЛИДНО: Целевой столбец должен иметь ограничение PRIMARY KEY или UNIQUE.
CREATE TABLE TableA (id INT); -- id не UNIQUE
CREATE TABLE TableB (a_id INT, FOREIGN KEY (a_id) REFERENCES TableA(id)); -- ОШИБКА

Итог:

  • Внешний ключ гарантирует ссылочную целостность (значение существует в другой таблице), но не уникальность.
  • Множество строк в дочерней таблице (Employees) могут ссылаться на одну и ту же строку в родительской таблице (Departments), создавая отношение «один-ко-многим».