Что такое внешний ключ в базе данных?sql-18

Внешний ключ (Foreign Key, FK) — это механизм обеспечения ссылочной целостности в реляционных базах данных, который создаёт отношение между двумя таблицами. Внешний ключ в одной таблице ссылается на первичный ключ (или уникальный ключ) в другой таблице, устанавливая логическую связь между ними.

Основные характеристики внешнего ключа

  1. Связь между таблицами
    FK создаёт отношение "родитель-потомок" между таблицами.

  2. Обеспечение целостности
    Гарантирует, что данные в связанных таблицах остаются согласованными.

  3. Ограничения действий
    Определяет поведение при удалении или обновлении родительской записи.

Синтаксис создания внешнего ключа

При создании таблицы

CREATE TABLE orders (
    order_id INT PRIMARY KEY,
    customer_id INT,
    order_date DATE,
    FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
);

Добавление к существующей таблице

ALTER TABLE order_items
ADD CONSTRAINT fk_order
FOREIGN KEY (order_id) REFERENCES orders(order_id);

Варианты поведения при изменении данных

  1. NO ACTION (по умолчанию)
    Запрещает удаление/изменение родительской записи, если есть ссылающиеся дочерние записи.

  2. CASCADE
    Автоматически удаляет/обновляет дочерние записи при изменении родительской.

    FOREIGN KEY (dept_id) REFERENCES departments(dept_id) ON DELETE CASCADE
    
  3. SET NULL
    Устанавливает NULL в FK при удалении родительской записи (столбец должен допускать NULL).

    FOREIGN KEY (manager_id) REFERENCES employees(emp_id) ON DELETE SET NULL
    
  4. SET DEFAULT
    Устанавливает значение по умолчанию для FK при изменении родительской записи.

  5. RESTRICT
    Аналогичен NO ACTION, но проверка выполняется сразу.

Примеры использования внешних ключей

Связь один-ко-многим

CREATE TABLE departments (
    dept_id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE employees (
    emp_id INT PRIMARY KEY,
    name VARCHAR(100),
    dept_id INT,
    FOREIGN KEY (dept_id) REFERENCES departments(dept_id)
);

Связь многие-ко-многим через промежуточную таблицу

CREATE TABLE students (
    student_id INT PRIMARY KEY,
    name VARCHAR(100)
);

CREATE TABLE courses (
    course_id INT PRIMARY KEY,
    title VARCHAR(100)
);

CREATE TABLE student_courses (
    student_id INT,
    course_id INT,
    PRIMARY KEY (student_id, course_id),
    FOREIGN KEY (student_id) REFERENCES students(student_id),
    FOREIGN KEY (course_id) REFERENCES courses(course_id)
);

Проверка существующих внешних ключей

В разных СУБД используются различные системные представления:

MySQL:

SELECT * FROM information_schema.REFERENTIAL_CONSTRAINTS;

SQL Server:

SELECT * FROM sys.foreign_keys;

PostgreSQL:

SELECT * FROM information_schema.table_constraints
WHERE constraint_type = 'FOREIGN KEY';

Ограничения и особенности внешних ключей

  1. Типы данных должны совпадать
    Тип FK должен точно соответствовать типу PK, включая размерность.

  2. Производительность
    FK создаёт дополнительные проверки, что может влиять на скорость операций DML.

  3. Каскадные операции
    ON DELETE CASCADE может быть опасным при непродуманном проектировании.

  4. Отложенные проверки
    Некоторые СУБД поддерживают отложенную проверку ограничений (DEFERRABLE).

Резюмируем: внешний ключ — это важнейший инструмент поддержания ссылочной целостности данных, который обеспечивает логические связи между таблицами и защищает от появления "висящих" ссылок. Правильное использование FK значительно повышает надёжность и согласованность данных в реляционной базе.