Центр Диагностики & База Системных Ошибок

Решения для Windows Server, Active Directory, 1С, СУБД, Linux, Cisco, MikroTik и IP-телефонии.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, баз данных и сетевого оборудования. Перед выполнением действий обязательно создайте резервную копию. При отсутствии необходимой квалификации обратитесь к ИТ-специалистам.

PostgreSQL Error 23503: foreign_key_violation — ошибки внешних ключей

Обновлено: 25.08.2026  ·  Официальная база знаний
  • Ошибка: ERROR: insert or update on table "orders" violates foreign key constraint "fk_user" (SQLSTATE 23503). Detail: Key (user_id)=(999) is not present in table "users".
  • Ошибка при удалении: update or delete on table violates foreign key constraint ... Key is still referenced.
  • Появление «битых ссылок» и объектов вида <Объект не найден> в базах 1С.

1. Поиск отсутствующих родительских записей

SELECT o.id, o.user_id 
FROM orders o 
LEFT JOIN users u ON o.user_id = u.id 
WHERE u.id IS NULL;

2. Настройка каскадного удаления (CASCADE)

Если при удалении родителя требуется автоматически удалять дочерние строки:

ALTER TABLE orders 
DROP CONSTRAINT fk_user,
ADD CONSTRAINT fk_user 
    FOREIGN KEY (user_id) 
    REFERENCES users(id) 
    ON DELETE CASCADE;

3. Использование отложенных внешних ключей (DEFERRABLE)

Для сложных цепочек связанных вставок внутри одной транзакции:

ALTER TABLE orders 
ADD CONSTRAINT fk_user 
    FOREIGN KEY (user_id) 
    REFERENCES users(id) 
    DEFERRABLE INITIALLY DEFERRED;

4. Временное отключение проверки триггеров целостности (для миграций)

-- Только для разовых административных задач импорта!
ALTER TABLE orders DISABLE TRIGGER ALL;
-- Выполнение импорта
ALTER TABLE orders ENABLE TRIGGER ALL;
Практический опыт инженера: Всегда индексируйте поля внешних ключей вручную. Отсутствие индекса на FK приводит к последовательному сканированию (Seq Scan) всей дочерней таблицы при каждом DELETE из родительской.

Частые вопросы (FAQ)

Почему возникает ошибка 23503 при вставке данных?

Вставляемое значение в столбце внешнего ключа (FK) отсутствует в первичном ключе (PK) родительской таблицы.

Как исправить 'Объект не найден' в 1С:Предприятие?

Запустите тестирование и исправление в режиме 'Очищать ссылки' или 'Создавать объекты' для восстановления ссылочной целостности таблиц СУБД.

Что делает опция ON DELETE SET NULL?

При удалении родительской строки значение внешнего ключа во всех связанных дочерних записях автоматически заменяется на NULL.

Нужно ли создавать индекс на колонку Foreign Key?

Да! PostgreSQL не создает индексы на внешние ключи автоматически. Наличие индекса критически необходимо для предотвращения блокировок всей таблицы при удалении родительских строк.