обнаружение зависимости от удаления - PullRequest
0 голосов
/ 04 февраля 2012

Я хотел бы удалить строки из таблицы, где не существует зависимостей от внешнего ключа.Если они существуют, строки должны быть помечены как «тупые» для поддержания целостности отношений.Цель состоит в том, чтобы сохранить только необходимые данные.

Удаление затронет только одну строку;это не вызывает каскадное удаление, и я не пытаюсь удалить иждивенцев.Например, на строку клиента ссылаются во многих других таблицах, таких как счет-фактура, соглашение, заказ на изменение и т. Д., Эта строка клиента должна быть помечена как «не заполненная».Если таких ссылок нет, строка клиента может быть удалена из таблицы.

Я ищу совет о том, как лучше всего справиться с этим из кода клиентского приложения.Я использую PostgreSQL 9.1.

Вот текущий подход, основанный на «знании» Постгресом зависимостей внешнего ключа:

Begin transation
delete row x
if SQLSTATE Error Code = 23503
  update row set deadfiled = true
if success
  commit transaction
else rollback

В некоторых публикациях кажется, что вышеупомянутый метод считается хрупким.Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 04 февраля 2012

Я никогда не использовал PostgreSQL, но похоже, что вы используете подход на основе курсора .

Как насчет решения на основе набора вместо этого??

Запустить запрос на обновление, который проверяет наличие зависимостей и помечает эти записи ...

update parent 
set deadfiled = true
where
    exists (
        select *
        from dependency1 as d1
        where d1.id = parent.id
    )
    or
    exists (
        select *
        from depenedency2 as d2
        where d2.id = parent.id
    )
    --or ... etc.,  keep adding dependency checks

..., а затем удаляет те, для которых флаг не установлен:

delete from parent where deadfiled = false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...