Ответ
Foreign Key (внешний ключ) — это ограничение (constraint) в реляционных базах данных, которое используется для установления и поддержки связи между данными в двух таблицах. Он гарантирует ссылочную целостность данных.
Ключевые цели и функции:
Обеспечение ссылочной целостности: Внешний ключ не позволяет создавать записи в дочерней таблице, которые ссылаются на несуществующие записи в родительской таблице. Это предотвращает появление "осиротевших" данных.
Определение связей: Явно определяет отношения между таблицами, такие как "один-ко-многим" (
one-to-many
) или "один-к-одному" (one-to-one
).Каскадные операции (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"`
}