Ловушка Foreign Key: почему удаление строки вешает базу Ты удаляешь… — SQL Academy: всё о реляционных БД и SQL — TG.ME

🪤 Ловушка Foreign Key: почему удаление строки вешает базу

Ты удаляешь одного пользователя, а внезапно зависает весь проект. Если ты работаешь в PostgreSQL, обычный внешний ключ может стать причиной жесткой блокировки.

⚙️ В чём подвох?
Многие уверены, что FOREIGN KEY автоматически создаёт индекс на колонку связи.
🔹 В MySQL это действительно так.
🔹 А вот в PostgreSQL — нет. Индекс нужно создавать вручную.

📉 Что происходит при удалении
Когда ты удаляешь запись из родительской таблицы (например, юзера), базе нужно убедиться, что на него нет ссылок в дочерней таблице (например, в заказах).
🔸 Без индекса база делает Full Table Scan — перебирает каждую строку в заказах. Это как искать нужное предложение, читая всю книгу целиком.
🔸 На время этого долгого поиска дочерняя таблица блокируется. Очередь запросов растёт, пока база не сломается от перегрузки.

🚀 Решение
Просто добавь индекс на колонку, которая ссылается на другую таблицу:
CREATE INDEX idx_orders_user_id ON orders(user_id);


💡 Всегда вручную индексируй колонки с внешними ключами в PostgreSQL, чтобы связи работали безопасно и быстро.
🔥20❤8👍4
July 27, 2026 4.2K 19