SQLite LinuxWindowsmacOS

SQLite: FOREIGN KEY constraint failed

  • Обновлено
  • Чтение ≈ 2 минуты

Краткий ответ

Нарушено ограничение внешнего ключа: связанной записи нет или она удаляется. Проверьте порядок вставки и включите PRAGMA foreign_keys.

В этой статье
  1. Что означает ошибка
  2. Причины и признаки
  3. Пошаговое решение
  4. Если проблема осталась

#Что означает ошибка

Сообщение
FOREIGN KEY constraint failed

Нарушено ограничение внешнего ключа: связанной записи нет или она удаляется. Проверьте порядок вставки и включите PRAGMA foreign_keys.

#Причины и признаки

Возможная причинаКак узнатьЧто делать
Нет родителяВставляемый внешний ID отсутствует у родителяСначала создать правильную родительскую запись
Удаление родителяУдаляемая запись используется дочерней таблицейПроверить зависимости и бизнес-правило удаления
Неверный порядокДочерняя запись пишется раньше родительскойИсправить порядок транзакции
Тип данныхВ ключевых полях разные значения или типыСверить реальные внешние ключи и значения

#Пошаговое решение

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

#Если проблема осталась

Если «SQLite: FOREIGN KEY constraint failed» повторяется, сохраните время, состояние подключения и точный текст ошибки. Не меняйте сразу несколько настроек — иначе станет трудно понять, какое действие повлияло на результат.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.