Для чего нужен Foreign key

Ответ

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

Ключевые цели и функции:


  1. Обеспечение ссылочной целостности: Внешний ключ не позволяет создавать записи в дочерней таблице, которые ссылаются на несуществующие записи в родительской таблице. Это предотвращает появление "осиротевших" данных.



  2. Определение связей: Явно определяет отношения между таблицами, такие как "один-ко-многим" (one-to-many) или "один-к-одному" (one-to-one).


  3. Каскадные операции (Cascading Actions): Позволяют автоматически управлять связанными данными при изменении родительской записи. Основные действия:

    • ON DELETE CASCADE: При удалении родительской записи автоматически удаляются все связанные дочерние записи.
    • ON UPDATE CASCADE: При изменении первичного ключа родительской записи он автоматически обновляется во всех дочерних записях.
    • ON DELETE SET NULL: При удалении родительской записи значение внешнего ключа в дочерних записях устанавливается в NULL.
    • RESTRICT / NO ACTION (поведение по умолчанию): Запрещает удаление или обновление родительской записи, если на нее есть ссылки.

Пример в SQL:

-- Родительская таблица
CREATE TABLE customers (
    id INT PRIMARY KEY,
    name VARCHAR(255)
);

-- Дочерняя таблица
CREATE TABLE orders (
    id INT PRIMARY KEY,
    order_number VARCHAR(50),
    customer_id INT,
    -- Устанавливаем внешний ключ
    FOREIGN KEY (customer_id) 
        REFERENCES customers(id) 
        ON DELETE SET NULL -- Если клиент удален, заказ останется, но без привязки
);

Пример в Go при работе с ORM (GORM):

// GORM автоматически распознает эту связь и создаст
// ограничение внешнего ключа при миграции.

type Customer struct {
    ID   uint
    Name string
    // У клиента может быть много заказов
    Orders []Order 
}

type Order struct {
    ID         uint
    OrderNumber string
    // Поле для внешнего ключа
    CustomerID uint
    // Принадлежность к структуре Customer
    Customer   Customer `gorm:"foreignKey:CustomerID"`
}