#Что означает ошибка
FOREIGN KEY constraint failed
Нарушено ограничение внешнего ключа: связанной записи нет или она удаляется. Проверьте порядок вставки и включите PRAGMA foreign_keys.
#Причины и признаки
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Нет родителя | Вставляемый внешний ID отсутствует у родителя | Сначала создать правильную родительскую запись |
| Удаление родителя | Удаляемая запись используется дочерней таблицей | Проверить зависимости и бизнес-правило удаления |
| Неверный порядок | Дочерняя запись пишется раньше родительской | Исправить порядок транзакции |
| Тип данных | В ключевых полях разные значения или типы | Сверить реальные внешние ключи и значения |
#Пошаговое решение
- Определите таблицу и связь, вызвавшую отказОшибка
FOREIGN KEY constraint failedозначает нарушение связи между строками. В клиенте sqlite3 откройте копию БД командойsqlite3 app.db; внутри выполнитеPRAGMA foreign_key_list('имя_таблицы');, заменив имя на таблицу из вашего INSERT/UPDATE/DELETE. Просмотрите поляfrom,table,to: они показывают, какое значение дочерней строки должно существовать в родительской таблице. Сначала сохраните копию базы и исходного SQL. - Проверьте наличие родительской строки до INSERTЕсли вставляете заказ с
customer_id, проверьте запросомSELECT id FROM customers WHERE id = 42;, подставив собственные реальные таблицу, поле и значение. Если результата нет, сначала создайте корректную запись клиента, затем заказ; не вводите фиктивный идентификатор ради прохождения ограничения. Если родительский ID приходит из другой транзакции, убедитесь, что она успешно завершилась, и учтите, что SQLite использует отдельные соединения. - Для DELETE проверьте дочерние записи и политику удаленияПеред удалением родителя найдите записи, которые на него ссылаются, например
SELECT * FROM orders WHERE customer_id = 42;. Выберите бизнес-правило: запрет удаления, явное переназначение дочерних записей или заранее предусмотренныйON DELETE CASCADEв схеме. Изменять внешний ключ или включать каскад только ради устранения ошибки нельзя — это может уничтожить связанные данные. Выполните решение в тестовой копии и проверьте количество затронутых строк. - Проверьте ограничения и повторите операциюВ sqlite3 выполните
PRAGMA foreign_keys;— ожидается1для включённой проверки на текущем соединении. КомандаPRAGMA foreign_key_check;должна вернуть пустой результат, если существующих нарушений нет. Не отключайтеforeign_keysдля обхода ошибки: это лишь скрывает нарушение целостности. Повторите исходный запрос на проверенной копии, затем в рабочей базе при разрешённом окне изменений.
#Если проблема осталась
Если «SQLite: FOREIGN KEY constraint failed» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.